Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Překladače 6. Sémantická analýza © Milan Keršláger 29.9.2016

Podobné prezentace


Prezentace na téma: "Překladače 6. Sémantická analýza © Milan Keršláger 29.9.2016"— Transkript prezentace:

1 Překladače 6. Sémantická analýza © Milan Keršláger

2 Sémantická analýza ● třetí fáze zpracování zdrojového kódu ● zabývá se významem symbolů a skupin symbolů ● vzniká tabulka symbolů ● vstup: derivační strom ● dodává syntaktický analyzátor ● výstup: intermediální kód ● postihuje strukturu a částečně i kód programu ● sémantické chyby ● použití nedeklarované proměnné, nekompatibilní datový typ proměnné ve výrazu či argumentu funkce

3 Tabulka symbolů ● obsahuje pojmenované identifikátory ● nevztahuje se na klíčová slova jazyka ● proměnné, konstanty, názvy funkcí, návěští,... ● lexikální (ani syntaktická) analýza je neumí odlišit ● využívá se: ● při překladu – překladač ● při provádění – interpret ● položky tabulky (sloupce): ● název, typ, délka, deklarováno?, adresa, použito?

4 Ukázka tabulky symbolů

5 Význam položek – 1 ● typ ● proměnná – datový typ ● funkce – ukládáme více údajů: – počet a typ jednotlivých parametrů – volání odkazem, hodnotou – datový typ návratové hodnoty – třída v OOP – navíc předek, vlastnosti,... ● délka ● závislá na definici typu v konkrétním jazyce ● může být závislá na použité platformě

6 Význam položek – 2 ● deklarováno ● slouží k odhalení sémantické chyby ● v některých jazycích není deklarace nutná ● adresa ● absolutní adresa, relativní adresa, index ● interpret ukládá hodnoty přímo do tabulky ● použito ● slouží k odhalení sémantické chyby

7 Využití tabulky symbolů ● zjišťování sémantických chyb ● byl již symbol použit?, jakého je typu? ● absence deklarace ● nelze kruhové deklarace ● lze dopřednou definici – způsobuje potíže (závislosti → víceprůchodová analýza) ● při generování cílového kódu (další fáze) ● tabulka zůstává uložena ● při interpretování kódu ● obsahuje hodnoty proměnných

8 Realizace tabulky symbolů ● snadné prohledávání ● po načtení symbolu je nutné zjistit, není-li v tabulce ● důležité u překladače i interpretu ● volba vhodné datové struktury ● statický seznam, dynamický seznam ● binární strom, dynamické pole záznamů ● řídká tabulka, hashovaná tabulka ● řazení záznamů ● podle abecedy ● index podle abecedy – data uspořádána jinak

9 Vznik tabulky symbolů ● při sémantické analýze ● klasický přístup ● máme k dispozici veškeré potřebné údaje ● v dřívějších fázích překladu ● vlastnosti doplňujeme později ● při lexikální analýze – neznámé identifikátory vloží do tabulky – atribut symbolu pak odkazuje do tabulky ● při syntaktické analýze

10 Bloková struktura programu ● strukturované jazyky ● moderní technika programování ● umožňují efektivní kontrolu použití objektů ● rozlišuje globální a lokální objekty ● přístupnost lokálních objektů je omezená ● stejné jméno lokálního objektu neovlivní globální ● bloky vytvářejí stromovou strukturu ● vnořený blok je ve stromě podřízený ● objekt je dosažitelný jen z podřízených bloků ● každý blok svoji tabulku

11 Bloková struktura ● 1: tab1A1, B1 ● 2: tab2 → tab1C2, D2, A1, B1 ● 3: tab3 → tab1E3, F3, A1, B1 ● 4: tab4 → tab3 → tab1G4, H4, E3, F3, A1, B1 A1, B1 C2, D2E3, F3 G4, H

12 Organizace do stromu tab 1 tab 2 tab 3 ● 1: tab1A1, B1 ● 2: tab2 → tab1C2, D2, A1, B1 ● 3: tab3 → tab1E3, F3, A1, B1 ● 4: tab4 → tab3 → tab1G4, H4, E3, F3, A1, B1

13 Zpracování ● organizace tabulek ● každý blok svoji tabulku – podřízený blok níže ve stromové struktuře ● zaznamenáme odkazy na nadřízené bloky – umožňuje procházení nadřízené tabulky ● překrývání proměnných ● vnořená překrývá stejnou z nadřízeného bloku ● využití zásobníku ● vstup do bloku = volání procedury ● na zásobník kopii tabulky symbolů

14 Intermediální kód ● intermediální kód se lépe optimalizuje ● optimalizace je další fáze překladu programu ● chybí v něm adresy operandů ● není ještě rozhodnuto o využití registrů CPU ● různé varianty i. k. s ohledem na další využití ● varianty pro kompilaci – musí být snadno optimalizovatelné – snadná transformace do cílového strojového kódu ● varianty pro interpretaci – bez dalších úprav snadno intepretovatelný

15 Varianty intermediálního kódu ● tří-adresový kód ● základní: operátor, argument1, argument2, výsledek ● zhuštěný: operátor, argument1, argument2 ● sémantický strom ● je to ohodnocený syntaktický strom ● postfixový tvar ● tzv. polská notace

16 Tří-adresový kód ● jistá podobnost s assemblerem ● jeden řádek → několik strojových instrukcí ● příklad: ● A := (-B) * (C + D)

17 Sémantický strom

18 Postfixová notace ● operátor umístěn za operandy ● tzv. reverzní polská notace ● jednoduché kalkulátory nevyžadující závorky ● infixový zápis: (1 + 2) * (3 + 4) ● postfixový tvar: * ● převod pomocí překladové gramatiky ● při výpočtu se používá zásobníkový automat ● snadný převod do strojového kódu ● optimalizace není příliš snadná ● vhodný pro interpretaci i kompilaci

19 Typová kontrola ● vztahuje se na: ● datové typy operandů aritmetických a relačních operátorů ● kontroly parametrů funkcí ● další příkazy obsahující proměnné prvky ● operátor vyžaduje operandy určitého typu ● celé + celé = celé ● reálné + reálné = reálné ● znak + znak = řetězec ● řetězec + řetězec = řetězec ● jinak buď přetypování nebo hlášení chyby

20 Přetypování ● nejsou-li datové typy kompatibilní, přetypujeme ● stanovení priority datových typů ● operand s nižší prioritou přetypujeme ● priorita v jazyce C pro implicitní přetypování: int → unsigned int → long → unsigned long → float → double → long double ● přetěžování operátorů ● dynamická posloupnost datových typů a předpisů ● polymorfismus ● volání funkce pro různé typy (i počet) parametrů ● funkce vrací hodnotu různých datových typů

21 Silně typované jazyky ● tzv. typově bezpečné jazyky ● ADA, Java, C#, Python ● nevylučuje to možnost chyby ● usnadňuje kontrolu programátora ● při každé operaci provedena kontrola dat. typů → chybové hlášení nebo dynamické přetypování ● některé jazyky vyžadují při deklaraci nutně typ ● pro každou operaci operandy konkrétního typu

22 Slabě typované jazyky, netypové ● méně kontrol datových typů ● příčina běhových chyb ● jazyk C, Perl ● operaci je možné provést s různými typy ● někdy jen do určité míry ● např.: printf(“%d“, (1+“1“)); ● netypové jazyky téměř neexistují ● shell datové typy nemá (interně je však používá) ● možnost změny chování jazyka ● VisualBasic.NET nejprve slabě, pak silně typový

23 Statická sémantika ● statická typová kontrola ● Java, Ada, jazyk C ● základní práce s tabulkou symbolů ● řeší se při překladu programu ● forma a nutnost deklarací, typy parametrů ● význam příkazů a jazykových konstrukcí ● staticky typované jazyky ● deklarace vždy s datovým typem ● možnost větší typové kontroly ● za běhu typicky jen chyba přetečení

24 Dynamická sémantika ● dynamická typová kontrola ● řeší se za běhu programu ● vede k více běhovým chybám ● dynamicky typované jazyky ● Python, Smalltalk, Prolog,... ● nevyžadují uvádění datového typu ani deklarace ● nová proměnná dle výsledku vyhodnocení výrazu ● možnost změny typu proměnné za běhu programu ● zkracuje se zápis kódu


Stáhnout ppt "Překladače 6. Sémantická analýza © Milan Keršláger 29.9.2016"

Podobné prezentace


Reklamy Google