Atributovaný překlad

Podobné dokumenty
Syntaktická analýza. Implementace LL(1) překladů. Šárka Vavrečková. Ústav informatiky, FPF SU Opava

Poslední aktualizace: 14. října 2011

Náznak ukázky syntaxe a sémantiky pro projekt. 1 Syntaktické prvky. Poslední aktualizace: 8.

Implementace LL(1) překladů

IAJCE Přednáška č. 12

Aplikovaná informatika. Podklady předmětu Aplikovaná informatika pro akademický rok 2006/2007 Radim Farana. Obsah. Algoritmus

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE LL SYNTAKTICKÁ ANALÝZA DOKONČENÍ, IMPLEMENTACE.

Vyhledávání v tabulkách

POLYNOM. 1) Základní pojmy. Polynomem stupně n nazveme funkci tvaru. a se nazývají koeficienty polynomu. 0, n N. Čísla. kde

Uplatnění metod na zvolený jazyk

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz

Užití binomické věty

Programování v Matlabu

Vlastnosti Derivační strom Metody Metoda shora dolů Metoda zdola nahoru Pomocné množiny. Syntaktická analýza. Metody a nástroje syntaktické analýzy

Binární vyhledávací stromy

Pojem času ve finančním rozhodování podniku

Syntaxí řízený překlad

Sekvenční logické obvody(lso)

4 DOPADY ZPŮSOBŮ FINANCOVÁNÍ NA INVESTIČNÍ ROZHODOVÁNÍ

Sémantika Tabulka symbolů Intermediální kód Typová kontrola, přetypování Statická a dynamická sémantika. Sémantická analýza.

8.2.1 Aritmetická posloupnost I

Přijímací řízení akademický rok 2013/2014 Bc. studium Kompletní znění testových otázek matematika

Přijímací řízení akademický rok 2012/2013 Kompletní znění testových otázek matematické myšlení

Petr Šedivý Šedivá matematika

4.2 Elementární statistické zpracování Rozdělení četností

Budeme pokračovat v nahrazování funkce f(x) v okolí bodu a polynomy, tj. hledat vhodné konstanty c n tak, aby bylo pro malá x a. = f (a), f(x) f(a)

8) Jaké jsou důvody pro použití víceprůchodového překladače Dříve hlavně kvůli úspoře paměti, dnes spíše z důvodu optimalizace

Syntaxí řízený překlad

Rozhodovací stromy. Úloha klasifikace objektů do tříd. Top down induction of decision trees (TDIDT) - metoda divide and conquer (rozděl a panuj)

Úvod do programovacích jazyků (Java)

Princip paralelního řazení vkládáním (menší propadává doprava)

Překladač a jeho struktura

České vysoké učení technické v Praze. Fakulta dopravní. Semestrální práce. Statistika

Interpret jazyka IFJ2011

DERIVACE FUNKCÍ JEDNÉ REÁLNÉ PROM

M - Posloupnosti VARIACE

Binární vyhledávací strom pomocí směrníků Miroslav Hostaša L06620

Dobývání znalostí. Doc. RNDr. Iveta Mrázová, CSc. Katedra teoretické informatiky Matematicko-fyzikální fakulta Univerzity Karlovy v Praze

pravděpodobnostn podobnostní jazykový model

Implementace aritmetického stromu pomocí směrníků

8.2.1 Aritmetická posloupnost

FUNKCÍ JEDNÉ REÁLNÉ PROMĚNNÉ PRVNÍ DIFERENCIÁL

1.3. POLYNOMY. V této kapitole se dozvíte:

6. FUNKCE A POSLOUPNOSTI

Aplikace teorie neuronových sítí

S polynomy jste se seznámili již v Matematice 1. Připomeňme definici polynomické

3. Sekvenční obvody. b) Minimalizujte budící funkce pomocí Karnaughovy mapy

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program

Závislost slovních znaků

Deskriptivní statistika 1

2 STEJNORODOST BETONU KONSTRUKCE

Matematická analýza I

Anotace. Dámy na šachovnici dominance a nezávislost. Aritmetické výrazy, notace a převody mezi nimi, nejdelší rostoucí podposloupnost.

Automaty a gramatiky(bi-aag) Formální překlady. 5. Překladové konečné automaty. h(ε) = ε, h(xa) = h(x)h(a), x, x T, a T.

Základy statistiky. Zpracování pokusných dat Praktické příklady. Kristina Somerlíková

1 Uzavřená Gaussova rovina a její topologie

Lineární a adaptivní zpracování dat. 8. Modely časových řad I.

Tento materiál vznikl díky Operačnímu programu Praha Adaptabilita CZ.2.17/3.1.00/33254

DUM č. 19 v sadě. 13. Ma-1 Příprava k maturitě a PZ algebra, logika, teorie množin, funkce, posloupnosti, řady, kombinatorika, pravděpodobnost

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Spojitost a limita funkcí jedné reálné proměnné

8.1.3 Rekurentní zadání posloupnosti I

SPOTŘEBITELSKÝ ÚVĚR. Na začátku provedeme inicializaci proměnných jejich vynulováním příkazem "restart". To oceníme při opakovaném použití dokumentu.

6 Intervalové odhady. spočteme aritmetický průměr, pak tyto průměry se budou chovat jako by pocházely z normálního. nekonečna.

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

Zimní semestr akademického roku 2015/ listopadu 2015

Programovací jazyk Pascal

Pravděpodobnost a aplikovaná statistika

6. Posloupnosti a jejich limity, řady

je konvergentní, právě když existuje číslo a R tak, že pro všechna přirozená <. Číslu a říkáme limita posloupnosti ( ) n n 1 n n n

Virtuální počítač. Uživatelský program Překladač programovacího jazyka Operační systém Interpret makroinstrukcí Procesor. PGS K.

IV-1 Energie soustavy bodových nábojů... 2 IV-2 Energie elektrického pole pro náboj rozmístěný obecně na povrchu a uvnitř objemu tělesa...

NMAF061, ZS Zápočtová písemná práce VZOR 5. ledna e bx2 x 2 e x2. F (b) =

6. ČÍSELNÉ POSLOUPNOSTI A ŘADY 6.1. ČÍSELNÉ POSLOUPNOSTI

Matematika 1. Katedra matematiky, Fakulta stavební ČVUT v Praze. středa 10-11:40 posluchárna D / 13. Posloupnosti

Analýza a zpracování signálů. 4. Diskrétní systémy,výpočet impulsní odezvy, konvoluce, korelace

11. přednáška 16. prosince Úvod do komplexní analýzy.

Interval spolehlivosti pro podíl

Konstruktory překladačů

Důchody jako pravidelné platby z investice

Statistika. Statistické funkce v tabulkových kalkulátorech MSO Excel a OO.o Calc

Regrese. Aproximace metodou nejmenších čtverců ( ) 1 ( ) v n. v i. v 1. v 2. y i. y n. y 1 y 2. x 1 x 2 x i. x n

MATICOVÉ HRY MATICOVÝCH HER

NMAF063 Matematika pro fyziky III Zkoušková písemná práce 25. ledna x 1 n

jsou reálná a m, n jsou čísla přirozená.

Příklady k přednášce 12 - Frekvenční metody

GRADIENTNÍ OPTICKÉ PRVKY Gradient Index Optical Components

f x a x DSM2 Cv 9 Vytvořující funkce Vytvořující funkcí nekonečné posloupnosti a0, a1,, a n , reálných čísel míníme formální nekonečnou řadu ( )

Elementární zpracování statistického souboru

13 Popisná statistika

Dynamické datové struktury IV.

Matematika I, část II

Rozklad problému na podproblémy

STUDIUM MAXWELLOVA ZÁKONA ROZDĚLENÍ RYCHLSOTÍ MOLEKUL POMOCÍ DERIVE 6

Anotace. zpět k rekurzi: teorie her. Martin Pergel,

PRACOVNÍ SEŠIT ALGEBRAICKÉ VÝRAZY. 2. tematický okruh: Připrav se na státní maturitní zkoušku z MATEMATIKY důkladně, z pohodlí domova a online

Přijímací řízení akademický rok 2013/2014 NavMg. studium Kompletní znění testových otázek matematika a statistika

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

základním prvkem teorie křivek v počítačové grafice křivky polynomiální n

Nové symboly pro čísla

Transkript:

Atributovaý překlad Typy atributů, implemetace Šárka Vavrečková Ústav iformatiky, FPF SU Opava sarka.vavreckova@fpf.slu.cz Posledí aktualizace: 5. prosice 008

Typy atributů Defiice (Sytetizovaé a dědičé atributy) Sytetizovaý atribut je atribut, jehož hodota závisí a hodotách atributů uzlů jeho vlastího podstromu v derivačím stromě. Slouží k posíláí údajů v derivačím stromě směrem zdola ahoru. Dědičý atribut je atribut, jehož hodota závisí a hodotách atributů adřízeého uzlu ebo uzlů a stejé úrovi derivačího stromu vlevo od tohoto symbolu. Žádý atribut emůže být zároveň sytetizovaý a dědičý. A BCD A.val = B.val + D.val, C.des = (A.m + B.val) 10 +.lex A.val je sytetizovaý, závisí a atributech symbolů-potomků C.des je dědičý, závisí a atributech předka a bratrů vlevo

Iicializace atributů Každý atribut musí být ěkde v derivačím stromě iicializová: dědičé atributy obvykle iicializujeme v kořei stromu (obecě a horím levém začátku cesty toku hodoty atributu derivačím stromem), sytetizovaé atributy jsou většiou iicializováy v listech stromu (tj. v termiálích pravidlech), často lexikálím aalyzátorem (pokud e, musíme iicializaci provést sami v příslušém pravidle).

Příklad Gramatika geeruje výraz ve tvaru hledej (; L) v hledej je klíčové slovo určující příkaz pro hledáí čísla v sezamu, je číslo, které má být hledáo, L geeruje sezam čísel, v je výstupí termiál, do jeho atributu uložíme výsledek Sytaktická pravidla v překladové gramatice: S hledej (; L) v L A A, L ε

S hledej (; L) v L A A, L ε Zpracováí výrazu hledej (; 9, ) S poz = 0 cis = hledej ( 1 hledaé číslo iicializujeme a, pozice a 0 (dědičé atributy) posíláme dolů hledaou hodotu a pozici 1 (zvýšili jsme o 1) 3 do ižšího patra přepošleme dědičé atributy posíláme dolů hledaou hodotu a pozici 5 iicializace sytetizovaého atributu a 0 (zatím ealeze) ; L 6 aleze, místo 0 pošleme pozici (idex) prvku 7 přeeseme do výstupího atributu ) v A, L A ε

S hledej (; L) v L A A, L ε Zpracováí výrazu hledej (; 9, ) S poz = 0 cis = hledej ( 1 hledaé číslo iicializujeme a, pozice a 0 (dědičé atributy) posíláme dolů hledaou hodotu a pozici 1 (zvýšili jsme o 1) 3 do ižšího patra přepošleme dědičé atributy posíláme dolů hledaou hodotu a pozici 5 iicializace sytetizovaého atributu a 0 (zatím ealeze) 9 ; L 6 aleze, místo 0 pošleme pozici (idex) prvku 7 přeeseme do výstupího atributu 1 ) v A, L A ε

S hledej (; L) v L A A, L ε Zpracováí výrazu hledej (; 9, ) S poz = 0 cis = hledej ( 1 hledaé číslo iicializujeme a, pozice a 0 (dědičé atributy) posíláme dolů hledaou hodotu a pozici 1 (zvýšili jsme o 1) 3 do ižšího patra přepošleme dědičé atributy posíláme dolů hledaou hodotu a pozici 5 iicializace sytetizovaého atributu a 0 (zatím ealeze) 9 ; L 6 aleze, místo 0 pošleme pozici (idex) prvku 7 přeeseme do výstupího atributu 1 ) v A 1, L A ε

S hledej (; L) v L A A, L ε Zpracováí výrazu hledej (; 9, ) S poz = 0 cis = hledej ( 1 hledaé číslo iicializujeme a, pozice a 0 (dědičé atributy) posíláme dolů hledaou hodotu a pozici 1 (zvýšili jsme o 1) 3 do ižšího patra přepošleme dědičé atributy posíláme dolů hledaou hodotu a pozici 5 iicializace sytetizovaého atributu a 0 (zatím ealeze) 9 ; L 6 aleze, místo 0 pošleme pozici (idex) prvku 7 přeeseme do výstupího atributu 1 ) v A 1, L A ε

S hledej (; L) v L A A, L ε Zpracováí výrazu hledej (; 9, ) S poz = 0 cis = hledej ( 1 hledaé číslo iicializujeme a, pozice a 0 (dědičé atributy) posíláme dolů hledaou hodotu a pozici 1 (zvýšili jsme o 1) 3 do ižšího patra přepošleme dědičé atributy posíláme dolů hledaou hodotu a pozici 5 iicializace sytetizovaého atributu a 0 (zatím ealeze) 9 ; L 6 aleze, místo 0 pošleme pozici (idex) prvku 7 přeeseme do výstupího atributu 1 ) v A 1, L 0 A alez = 0 ε

S hledej (; L) v L A A, L ε Zpracováí výrazu hledej (; 9, ) S poz = 0 cis = hledej ( 1 hledaé číslo iicializujeme a, pozice a 0 (dědičé atributy) posíláme dolů hledaou hodotu a pozici 1 (zvýšili jsme o 1) 3 do ižšího patra přepošleme dědičé atributy posíláme dolů hledaou hodotu a pozici 5 iicializace sytetizovaého atributu a 0 (zatím ealeze) 9 ; L 6 aleze, místo 0 pošleme pozici (idex) prvku 7 přeeseme do výstupího atributu 1 ) v A 1, L 0 A alez = 0 ε

S hledej (; L) v L A A, L ε Zpracováí výrazu hledej (; 9, ) S poz = 0 cis = hledej ( 1 hledaé číslo iicializujeme a, pozice a 0 (dědičé atributy) posíláme dolů hledaou hodotu a pozici 1 (zvýšili jsme o 1) 3 do ižšího patra přepošleme dědičé atributy posíláme dolů hledaou hodotu a pozici 5 iicializace sytetizovaého atributu a 0 (zatím ealeze) 9 ; L 6 aleze, místo 0 pošleme pozici (idex) prvku 7 přeeseme do výstupího atributu 1 ) v A 1, L 0 A alez = 0 ε

S hledej (; L) v L A A, L ε Atributová gramatika Použijeme atributy [lex], L[poz, cis, alez], A[poz, cis, alez], v[vysl] dědičé: poz, cis, vysl sytetizovaé: lex, alez hledej ( 9 S poz = 0 cis = ; L 1 ) v A 1, L S hledej (; {L.poz = 0, L.cis =.lex} L) v {v.vysl = L.alez} L {A.poz = L.poz + 1, A.cis = L.cis} A {if.lex = A.cis the L.alez = A.poz else L.alez = A.alez} A, {L.poz = A.poz, L.cis = A.cis} L {A.alez = L.alez} A ε {A.alez = 0} 0 A alez = 0 ε

S hledej (; L) v L A A, L ε Atributová gramatika Použijeme atributy [lex], L[poz, cis, alez], A[poz, cis, alez], v[vysl] dědičé: poz, cis, vysl sytetizovaé: lex, alez hledej ( 9 S poz = 0 cis = ; L 1 ) v A 1, L S hledej (; {L.poz = 0, L.cis =.lex} L) v {v.vysl = L.alez} L {A.poz = L.poz + 1, A.cis = L.cis} A {if.lex = A.cis the L.alez = A.poz else L.alez = A.alez} A, {L.poz = A.poz, L.cis = A.cis} L {A.alez = L.alez} A ε {A.alez = 0} 0 A alez = 0 ε

Determiistický překlad výrazů při iterpretaci Požadavky a gramatiku gramatika typu LL(1), silá LR(1) ebo jiá, kterou lze použít pro determiistický překlad často eí třeba použít výstupí termiály zachováváme prioritu operátorů

S i = A A BC C +BC C BC C ε B DE E DE E /DE E ε D D i D (A) Příklad LL(1) gramatika

Příklad LL(1) gramatika S i = A {Uloz(i.azev, A.val)} A B {C.m = B.val} C {A.val = C.val} C +B {C 1.m = C 0.m + B.val} C {C 0.val = C 1.val} C B {C 1.m = C 0.m B.val} C {C 0.val = C 1.val} C ε {C.val = C.m} B D {E.m = D.val} E {B.val = E.val} E D {E 1.m = E 0.m D.val} E {E 0.val = E 1.val} E /D {E 1.m = E 0.m/D.val} E {E 0.val = E 1.val} E ε {E.val = E.m} D {D.val =.lex} D i {D.val = ZjistiHodotu(i.azev)} D (A) {D.val = A.val}

S i = A S i = A {Uloz(i.azev, A.val)} A B {C.m = B.val} C {A.val = C.val} C +B {C 1.m = C 0.m + B.val} C {C 0.val = C 1.val} C B {C 1.m = C 0.m B.val} C {C 0.val = C 1.val} C ε {C.val = C.m} B D {E.m = D.val} E {B.val = E.val} E D {E 1.m = E 0.m D.val} E {E 0.val = E 1.val} E /D {E 1.m = E 0.m/D.val} E {E 0.val = E 1.val} E ε {E.val = E.m} D {D.val =.lex} D i {D.val = ZjistiHodotu(i.azev)} D (A) {D.val = A.val} B C D E B C D E D E + B C i D E ε D E ε ε i ε

S i = A S i = A {Uloz(i.azev, A.val)} A B {C.m = B.val} C {A.val = C.val} C +B {C 1.m = C 0.m + B.val} C {C 0.val = C 1.val} C B {C 1.m = C 0.m B.val} C {C 0.val = C 1.val} C ε {C.val = C.m} B D {E.m = D.val} E {B.val = E.val} E D {E 1.m = E 0.m D.val} E {E 0.val = E 1.val} E /D {E 1.m = E 0.m/D.val} E {E 0.val = E 1.val} E ε {E.val = E.m} D {D.val =.lex} D i {D.val = ZjistiHodotu(i.azev)} D (A) {D.val = A.val} B C D E B C 3 D 6 E D E + B C i 3 D E ε D E ε ε i ε

S i = A S i = A {Uloz(i.azev, A.val)} A B {C.m = B.val} C {A.val = C.val} C +B {C 1.m = C 0.m + B.val} C {C 0.val = C 1.val} C B {C 1.m = C 0.m B.val} C {C 0.val = C 1.val} C ε {C.val = C.m} B D {E.m = D.val} E {B.val = E.val} E D {E 1.m = E 0.m D.val} E {E 0.val = E 1.val} E /D {E 1.m = E 0.m/D.val} E {E 0.val = E 1.val} E ε {E.val = E.m} D {D.val =.lex} D i {D.val = ZjistiHodotu(i.azev)} D (A) {D.val = A.val} B C D E B C 3 D 6 E D E + B C i 3 5 30 D E ε D E ε 5 ε i ε

S i = A B 30 C S i = A {Uloz(i.azev, A.val)} A B {C.m = B.val} C {A.val = C.val} C +B {C 1.m = C 0.m + B.val} C {C 0.val = C 1.val} C B {C 1.m = C 0.m B.val} C {C 0.val = C 1.val} C ε {C.val = C.m} B D {E.m = D.val} E {B.val = E.val} E D {E 1.m = E 0.m D.val} E {E 0.val = E 1.val} E /D {E 1.m = E 0.m/D.val} E {E 0.val = E 1.val} E ε {E.val = E.m} D {D.val =.lex} D i {D.val = ZjistiHodotu(i.azev)} D (A) {D.val = A.val} D E 30 B C 3 D 6 30 E D E + B C i 3 5 30 D E 30 ε D E ε 5 val = m ε = 30 i ε

S i = A B 30 C S i = A {Uloz(i.azev, A.val)} A B {C.m = B.val} C {A.val = C.val} C +B {C 1.m = C 0.m + B.val} C {C 0.val = C 1.val} C B {C 1.m = C 0.m B.val} C {C 0.val = C 1.val} C ε {C.val = C.m} B D {E.m = D.val} E {B.val = E.val} E D {E 1.m = E 0.m D.val} E {E 0.val = E 1.val} E /D {E 1.m = E 0.m/D.val} E {E 0.val = E 1.val} E ε {E.val = E.m} D {D.val =.lex} D i {D.val = ZjistiHodotu(i.azev)} D (A) {D.val = A.val} D E 30 B C 3 D 6 30 E 8 D 8 E + B C i 3 5 30 D E 30 8 ε D E ε 5 val = m ε = 30 i ε

S i = A B 30 C S i = A {Uloz(i.azev, A.val)} A B {C.m = B.val} C {A.val = C.val} C +B {C 1.m = C 0.m + B.val} C {C 0.val = C 1.val} C B {C 1.m = C 0.m B.val} C {C 0.val = C 1.val} C ε {C.val = C.m} B D {E.m = D.val} E {B.val = E.val} E D {E 1.m = E 0.m D.val} E {E 0.val = E 1.val} E /D {E 1.m = E 0.m/D.val} E {E 0.val = E 1.val} E ε {E.val = E.m} D {D.val =.lex} D i {D.val = ZjistiHodotu(i.azev)} D (A) {D.val = A.val} D E 30 B 8 C 3 D 6 30 E 8 D 8 8 E + B C i 3 5 30 D E 30 8 val = m = 8 ε D E ε 5 val = m ε = 30 i ε

S i = A B 30 C S i = A {Uloz(i.azev, A.val)} A B {C.m = B.val} C {A.val = C.val} C +B {C 1.m = C 0.m + B.val} C {C 0.val = C 1.val} C B {C 1.m = C 0.m B.val} C {C 0.val = C 1.val} C ε {C.val = C.m} B D {E.m = D.val} E {B.val = E.val} E D {E 1.m = E 0.m D.val} E {E 0.val = E 1.val} E /D {E 1.m = E 0.m/D.val} E {E 0.val = E 1.val} E ε {E.val = E.m} D {D.val =.lex} D i {D.val = ZjistiHodotu(i.azev)} D (A) {D.val = A.val} D E 30 B 8 C 3 D i 3 6 30 E 5 30 D E 30 8 D 8 8 8 E val = m = 8 ε + B C 15 D E ε 5 val = m 15 ε = 30 i ε

S i = A B 30 C S i = A {Uloz(i.azev, A.val)} A B {C.m = B.val} C {A.val = C.val} C +B {C 1.m = C 0.m + B.val} C {C 0.val = C 1.val} C B {C 1.m = C 0.m B.val} C {C 0.val = C 1.val} C ε {C.val = C.m} B D {E.m = D.val} E {B.val = E.val} E D {E 1.m = E 0.m D.val} E {E 0.val = E 1.val} E /D {E 1.m = E 0.m/D.val} E {E 0.val = E 1.val} E ε {E.val = E.m} D {D.val =.lex} D i {D.val = ZjistiHodotu(i.azev)} D (A) {D.val = A.val} D E 30 B 8 C 3 D 6 30 E 8 D 8 8 E 15 + B C i 3 5 30 D E 30 8 val = m = 8 ε 15 D 15 15 E ε 5 val = m 15 ε = 30 i val = m ε = 15

S 37 i = A B 30 37 C S i = A {Uloz(i.azev, A.val)} A B {C.m = B.val} C {A.val = C.val} C +B {C 1.m = C 0.m + B.val} C {C 0.val = C 1.val} C B {C 1.m = C 0.m B.val} C {C 0.val = C 1.val} C ε {C.val = C.m} B D {E.m = D.val} E {B.val = E.val} E D {E 1.m = E 0.m D.val} E {E 0.val = E 1.val} E /D {E 1.m = E 0.m/D.val} E {E 0.val = E 1.val} E ε {E.val = E.m} D {D.val =.lex} D i {D.val = ZjistiHodotu(i.azev)} D (A) {D.val = A.val} D E 30 37 B 8 C 3 D 6 30 E 8 D 8 8 E 15 37 + B C 37 i 3 5 30 D E 30 8 val = m = 8 ε 15 D 15 15 E val = m ε = 37 5 val = m 15 ε = 30 i val = m ε = 15

Oproti sytaxi rozšíříme: Implemetace LL(1) překladu aprogramujeme všechy použité sématické fukce (včetě práce s tabulkou symbolů) do fukcí aprogramovaých pro sytaxi přidáme sématiku voláí sématických fukcí a vyhodocováí sématických pravidel určíme způsob předáváí atributů mezi symboly a pravidly Použijeme metodu rekurzivího sestupu. Termiály vstupí zpracovávají se stejě jako u sytaxe (fukce expect i) výstupí aprogramujeme fukci expect out ošetřující výstupí termiály

Atributy přeášíme Růzé typy atributů posíláme uvitř pravidla lokálími proměými, mezi pravidly (předek potomek) budeme zpracovávat takto: sytetizovaé atributy etermiálů posíláme rekurzí směrem ahoru, pro ě použijeme parametry volaé odkazem, aby bylo možé v adřízeé fukci zjistit hodotu vypočteou ve volaé podřízeé fukci, dědičé atributy etermiálů posíláme rekurzí směrem dolů, pro ě použijeme parametry volaé hodotou, sytetizovaé atributy vstupích termiálů ukládáme do globálí proměé (jsou součástí proměé typu TSymbol), obvykle je zde ukládá lexikálí aalyzátor, dědičé atributy výstupích termiálů buď přímo vypisujeme, ebo ukládáme do vhodé globálí proměé (dyamického sezamu, souboru).

S Av {v.vysl = A.val, VypisText(v.vysl)} A B {C.m = B.val} C {A.val = C.val} C +B {C 1.m = C 0.m + B.val} C {C 0.val = C 1.val} C B {C 1.m = C 0.m B.val} C {C 0.val = C 1.val} C ε {C.val = C.m} B D {E.m = D.val} E {B.val = E.val} E D {E 1.m = E 0.m D.val} E {E 0.val = E 1.val} E /D {E 1.m = E 0.m/D.val} E {E 0.val = E 1.val} E ε {E.val = E.m} D {D.val =.lex} D i {D.val = ZjistiHodotu(i.azev)} D (A) {D.val = A.val}

Datové typy a proměé type TTypSymbolu = (S_ID, S_NUM, S_PLUS, S_MINUS, S_MUL, S_DIV, S_LZAV, S_RZAV, S_VYSTUP, S_ENDOFFILE); TSymbol = record typ: TTypSymbolu; atribcislo: iteger; // celé číslo (S_NUM) atribstr: ^TObjekt; // ázev proměé (S_ID) var symbol: TSymbol;... // další proměé a datové typy

Ošetřeí chyb a pomocé fukce pro výstup procedure error(cost hlaska: strig); begi Koec := true; writel( Chyba při sytaktické aalýze a řádku,zak.cislo,, sloupci,zak.pozice, :,hlaska); Pomocé fukce pro výpis VypisTyp(typ: TTypSymbolu) převede datový typ a řetězec VypisHod(sym: TSymbol) převede symbol a řetězec

Vstupí a výstupí termiály procedure expect_i(vstupi_term: TTypSymbolu); // vstupí symboly begi if vstupi_term = symbol.typ the Lex else error( symbol,vypishod(symbol), eí očekávaého typu, VypisTyp(vstupi_term)); procedure expect_out(vystupi_term: TSymbol); begi if vystupi_term.typ = S_VYSTUP the VypisText(vystupi_term.atribcislo); // chyba se epředpokládá // výstupí symboly

Pravidla S Av {v.vysl = A.val, VypisText(v.vysl)} procedure S; var pom_sym: TSymbol; begi if symbol.typ i [S_NUM,S_ID,S_LZAV] the begi A(pom_sym); pom_sym := S_VYSTUP; // výstupí termiál v expect_out(pom_sym); ed else error( symbol,vypishod(symbol), eí očekávaého typu, VypisTyp(S_NUM),,,VypisTyp(S_ID), ebo,vypistyp(s_lzav));

Pravidla A B {C.m = B.val} C {A.val = C.val} procedure A(var val: iteger); var pomval: iteger; begi if symbol.typ i [S_NUM,S_ID,S_LZAV] the begi B(pomval); C(pomval,val); ed else error( symbol,vypishod(symbol), eí očekávaého typu, VypisTyp(S_NUM),,,VypisTyp(S_ID), ebo,vypistyp(s_lzav));

Pravidla C +B {C 1.m = C 0.m + B.val} C {C 0.val = C 1.val} C B {C 1.m = C 0.m B.val} C {C 0.val = C 1.val} C ε {C.val = C.m} procedure C(m: iteger; var val: iteger); var pomval: iteger; begi case symbol.typ of S_PLUS: begi expect_i(s_plus); B(pomval); C(m + pomval,val) S_MINUS: begi expect_i(s_minus); B(pomval); C(m - pomval,val)...

Pravidla C +B {C 1.m = C 0.m + B.val} C {C 0.val = C 1.val} C B {C 1.m = C 0.m B.val} C {C 0.val = C 1.val} C ε {C.val = C.m}... S_RZAV,S_ENDOFFILE: val := m; else error( symbol,vypishod(symbol), eí očekávaého typu, VypisTyp(S_PLUS),,,VypisTyp(S_MINUS),,,VypisTyp(S_RZAV), ebo koec vstupu )

Pravidla B D {E.m = D.val} E {B.val = E.val} procedure B(var val: iteger); var pomval: iteger; begi if symbol.typ i [S_NUM,S_ID,S_LZAV] the begi D(pomval); E(pomval,val); ed else error(...);

Pravidla E D {E 1.m = E 0.m D.val} E {E 0.val = E 1.val} E /D {E 1.m = E 0.m/D.val} E {E 0.val = E 1.val} E ε {E.val = E.m} procedure E(m: iteger; var val: iteger); var pomval: iteger; begi case symbol.typ of S_MUL: begi expect_i(s_mul); D(pomval); E(m * pomval,val) S_DIV: begi expect_i(s_div); D(pomval); if pomval = 0 the error( děleí ulou ) else E(m/pomval,val)...

Pravidla E D {E 1.m = E 0.m D.val} E {E 0.val = E 1.val} E /D {E 1.m = E 0.m/D.val} E {E 0.val = E 1.val} E ε {E.val = E.m}... S_PLUS,S_MINUS,S_RZAV,S_ENDOFFILE: val := m; else error(...)

Pravidla D {D.val =.lex} D i {D.val = ZjistiHodotu(i.azev)} D (A) {D.val = A.val} procedure D(var val: iteger); begi case symbol.typ of S_NUM: begi val := symbol.atribcis; expect_i(s_num) S_ID: begi val := symbol.atribstr^.hodota.i; expect_i(s_id)... // musíme zachytit předem, pak bude // přepsáo lexikálím aalyzátorem // z tabulky symbolů

Pravidla D {D.val =.lex} D i {D.val = ZjistiHodotu(i.azev)} D (A) {D.val = A.val}... S_LZAV: begi expect_i(lzav); A(val); expect_i(rzav) else error(...)

Hlaví fukce procedure Preklad; begi iit; // iicializace překladu včetě lexikálího aalyzátoru Lex; // předačteme jede symbol S; // spustíme rekurziví voláí doe; // ukočeí překladu, úklid paměti apod.

S i = V V AM A V + A V A ε M BF B M B M/ B ε F F i F (V ) Příklad silá LR(1) gramatika

Příklad silá LR(1) gramatika S i = V {Uloz(i.azev, V.val)} V AM {if A.op = S PLUS the V.val = A.val + M.val else V.val = A.val M.val} A V + {A.val = V.val, A.op = S PLUS} A V {A.val = V.val, A.op = S MINUS} A ε {A.val = 0, A.op = S PLUS} M BF {if B.op = S MUL the M.val = B.val F.val else M.val = B.val/F.val} B M {B.val = M.val, B.op = S MUL} B M / {B.val = M.val, B.op = S DIV} B ε {B.val = 1, B.op = S MUL} F {F.val =.lex} F i {F.val = ZjistiHodotu(i.azev)} F (V ) {F.val = V.val}

S 33 i = V A 13, + 0 M 13 V, + B F 5 0, A 7 M M 5 0 1, 7 1, V B F B F 0, + A 0 ε 1, B 1 ε M 0 1 ε 0 F 0 7 i 1 ε i S i = V {Uloz(i.azev, V.val)} V AM {if A.op = S PLUS the V.val = A.val+M.val else V.val = A.val M.val} A V + {A.val = V.val, A.op = S PLUS} A V {A.val = V.val, A.op = S MINUS} A ε {A.val = 0, A.op = S PLUS} M BF {if B.op = S MUL the M.val = B.val F.val else M.val = B.val/F.val} B M {B.val = M.val, B.op = S MUL} B M / {B.val = M.val, B.op = S DIV} B ε {B.val = 1, B.op = S MUL} F {F.val =.lex} F i {F.val = ZjistiHodotu(i.azev)} F (V ) {F.val = V.val}

Postup použijeme metodu přepisu rozkladové tabulky se zásobíkem do zásobíku ukládáme celé symboly včetě atributů atributy jsou je sytetizovaé

S #S 0 S i = V {Uloz(i.azev, V.val)} 1 V AM {if A.op = S PLUS the V.val = A.val + M.val else V.val = A.val M.val} A V + {A.val = V.val, A.op = S PLUS} 3 A V {A.val = V.val, A.op = S MINUS} A ε {A.val = 0, A.op = S PLUS} 5 M BF {if B.op = S MUL the M.val = B.val F.val 6 else M.val = B.val/F.val} B M {B.val = M.val, B.op = S MUL} 7 B M / {B.val = M.val, B.op = S DIV} 8 B ε {B.val = 1, B.op = S MUL} 9 F {F.val =.lex} 10 F i {F.val = ZjistiHodotu(i.azev)} 11 F (V ) {F.val = V.val} 1

Datové typy type TTypSymbolu = (S_ID, S_NUM, S_ROVNASE, S_PLUS, S_MINUS,// termiály S_MUL, S_DIV, S_LPAR, S_RPAR, S_ENDOFFILE, S_NS, S_NSC, S_NV, S_NA, S_NM, S_NB, S_NF, S_HASH); // etermiály TSymbol = record typ: TTypSymbolu; atribcislo: iteger; atribstr: ^TObjekt; TSymbolZasob = record typ: TTypSymbolu; atribcislo: iteger; // atributy val a lex atribstr: ^TObjekt; // atribut azev atribop: TTypSymbolu; // pro S_PLUS, S_MINUS, S_MUL, S_DIV

Proměé var koec: boolea; // idikátor ukočeí výpočtu symbol: TSymbol; // aktuálí symbol ze vstupu vrchol_zas: TSymbolZasob; // symbol a vrcholu zásobíku zasobik: TZasobik; // prvky jsou typu TSymbolZasob... // další používaé datové typy a proměé

Pravidla procedure reduce(cislo_prav: iteger); var SymbolZas: TSymbolZas; val: iteger; begi case cislo_prav of 0:... 1:... atd. doplíme podle pravidel

Pravidla S #S 0 0: begi Vyjmi_ze_zasobiku(vrchol_zas); // S Vyjmi_ze_zasobiku(vrchol_zas); // # SymbolZas.typ := S_NSC; Pridej_do_zasobiku(SymbolZas);

Pravidla S i = V {Uloz(i.azev, V.val)} 1 1: begi Vyjmi_ze_zasobiku(vrchol_zas); // V val := vrchol_zas.atribcislo; Vyjmi_ze_zasobiku(vrchol_zas); // = Vyjmi_ze_zasobiku(vrchol_zas); // i // uložíme vypočteou hodotu do tabulky symbolů: vrchol_zas.atribstr^.hodota.i := val; SymbolZas.typ := S_NS; Pridej_do_zasobiku(SymbolZas);

Pravidla V AM {if A.op = S PLUS the V.val = A.val + M.val else V.val = A.val M.val} : begi Vyjmi_ze_zasobiku(vrchol_zas); // M val := vrchol_zas.atribcislo; Vyjmi_ze_zasobiku(vrchol_zas); // A SymbolZas.typ := S_NV; if vrchol_zas.atribop = S_PLUS the SymbolZas.atribcislo := vrchol_zas.atribcislo + val else if vrchol_zas.atribop = S_MINUS the SymbolZas.atribcislo := vrchol_zas.atribcislo - val else error( chyba v sytaxi aritmetického výrazu, ealeze žádý ze symbolů, VypisTyp(S_PLUS), ebo,vypistyp(s_minus)); Pridej_do_zasobiku(SymbolZas);

Pravidla A V + {A.val = V.val, A.op = S PLUS} 3 3: begi Vyjmi_ze_zasobiku(vrchol_zas); // + Vyjmi_ze_zasobiku(vrchol_zas); // V SymbolZas.typ := S_NA; SymbolZas.atribop := S_PLUS; SymbolZas.atribcislo := vrchol_zas.atribcislo; Pridej_do_zasobiku(SymbolZas);

Pravidla A V {A.val = V.val, A.op = S MINUS} : begi Vyjmi_ze_zasobiku(vrchol_zas); // - Vyjmi_ze_zasobiku(vrchol_zas); // V SymbolZas.typ := S_NA; SymbolZas.atribop := S_MINUS; SymbolZas.atribcislo := vrchol_zas.atribcislo; Pridej_do_zasobiku(SymbolZas);

Pravidla A ε {A.val = 0, A.op = S PLUS} 5 5: begi SymbolZas.typ := S_NA; SymbolZas.atribop := S_PLUS; SymbolZas.atribcislo := 0; Pridej_do_zasobiku(SymbolZas);... // pro symboly M a B to bude podobé jako pro V a A, // ale esmíme zapomeout ošetřit děleí ulou

Pravidla F {F.val =.lex} 10 10: begi Vyjmi_ze_zasobiku(vrchol_zas); // SymbolZas.typ := S_NF; SymbolZas.atribcislo := vrchol_zas.atribcislo; Pridej_do_zasobiku(SymbolZas);

Pravidla F i {F.val = ZjistiHodotu(i.azev)} 11 11: begi Vyjmi_ze_zasobiku(vrchol_zas); // i with SymbolZas do begi typ := S_NF; atribcislo := vrchol_zas.atribstr^.hodota.i; Pridej_do_zasobiku(SymbolZas);

Pravidla F (V ) {F.val = V.val} 1 1: begi Vyjmi_ze_zasobiku(vrchol_zas); // ( Vyjmi_ze_zasobiku(vrchol_zas); // V with SymbolZas do begi typ := S_NF; atribcislo := vrchol_zas.atribcislo; Vyjmi_ze_zasobiku(vrchol_zas); // ) Pridej_do_zasobiku(SymbolZas);

Rozhodováí mezi pravidly podle tabulky i = + / ( ) $ S acc S r0 V push push push r1 A r9 r9 r9 M r r push push r r B push push push F r6 r6 r6 r6 r6 r6 r10 r10 r10 r10 r10 r10 i push r11 r11 r11 r11 r11 r11 = r5 r5 r5 + r3 r3 r3 r r r r7 r7 r7 / r8 r8 r8 ( r5 r5 r5 ) r1 r1 r1 r1 r1 r1 # push

Rozhodováí mezi pravidly podle tabulky S S i = + / ( ) $ acc r0 procedure Akce; begi case vrchol_zas of S_NSC: if symbol.typ = S_ENDOFFILE the accept else error( očekává koec souboru ); S_NS: if symbol.typ = S_ENDOFFILE the reduce(0) else error( očekává koec souboru );

Rozhodováí mezi pravidly podle tabulky i = + / ( ) $ V push push push r1 S_NV: case symbol.typ of S_PLUS,S_MINUS,S_RZAV: push; S_ENDOFFILE: reduce(1); else error( symbol,vypishod(symbol), eí očekávaého typu, VypisTyp(S_PLUS),,,VypisTyp(S_MINUS),,, VypisTyp(S_RZAV), ebo koec souboru );... // atd. pro všechy etermiály

Pravidla i = + / ( ) $ r10 r10 r10 r10 r10 r10 i push r11 r11 r11 r11 r11 r11 S_NUM: if symbol.typ i [S_PLUS,S_MINUS,S_MUL,S_DIV,S_RZAV, S_ENDOFFILE] the reduce(10) else error(...); S_ID: case symbol.typ of S_PLUS,S_MINUS,S_MUL,S_DIV,S_RZAV,S_ENDOFFILE: reduce(11); S_ROVNASE: push; else error(...);... // atd. pro všechy termiály

Ošetřeí chyb a akceptováí procedure error(cost hlaska: strig); begi Koec := true; writel( Chyba při sytaktické aalýze a řádku,zak.cislo,, sloupci,zak.pozice, :,hlaska); procedure accept; begi Koec := true;

Práce se vstupem procedure push; var SymbolZas: TSymbolZas; begi with SymbolZas do begi typ := symbol.typ; atribcislo := symbol.atribcislo; atribstr := symbol.atribstr; Pridej_do_zasobiku(SymbolZas); Lex; // lexikálí aalyzátor ačte další symbol

Iicializace a ukočeí procedure Iit; var SymbolZas: TSymbolZas; begi... // iicializace vstupu a výstupu Vytvor_zasobik; SymbolZas.typ := S_HASH; Pridej_do_zasobiku(SymbolZas); Lex; Koec := false; procedure Doe; begi Zlikviduj_zasobik; // uvolí paměť zabraou zásobíkem... // uzavřeí vstupu a výstupu

Řízeí překladu procedure Preklad; begi Iit; while (ot Koec) do Akce; Doe;