Interpretacija programa Semantička analiza Krunoslav Puljić 2013/2014
Semantička analiza Prevođenje Analiza Leksička analiza Sintaksna analiza Semantička analiza Sinteza Generiranje koda u međujeziku Optimizacija međuprikaza Generiranje objektnog programa Optimizacija objektnog programa Semantička analiza je treći korak u fazi analize
Semantička analiza Tablica znakova Leksički analizator Sintaksni analizator Semantički analizator Izvorni program Niz leksičkih jedinki Sintaksno stablo
Podatkovna struktura L.A. Podatkovnu strukturu leksičkog analizatora čine: Izvorni program Tablica uniformnih znakova Znakovi su zapisani onim redoslijedom kojim su leksičke jedinke zadane u izvornom programu Tablica znakova Prati i razne parametre leksičkih jedinki Sadrži: tablicu identifikatora, tablicu konstanti i tablicu ključnih riječi, operatora i specijalnih znakova
Mnemonik2 IzracunajCijenu() { ako (Kolicina >20) Cijena = 1000; inace Cijena = 1200; NovaCijena = Cijena; } Tablica znakova Leksička jedinka Pomak 00 ako 01 onda 02 inace...... 20 > 21 =...... 40 ; 41 ( 42 ) 43 { 44 }...... 60 IzracunajCijenu 61 Kolicina...... 75 20 IzracunajCijenu ( ) CR LF { CR LF TAB ako ( Kolicina > 20 )... 49 60 5A 41 5A 42 5A 43 5A 00 5A 41 49 61 I Z A Z B Z C Z null Z A I a IDN,I.C. KROS,( KROS,) KROS,{ KROS,ako KROS,( IDN,Kol. Hex ASC Mn2
Semantička analiza primjeri Je li x varijabla, polje ili funkcija? Da bismo znali što je x u izrazu x = a + b; moramo znati u kojem kontekstu se x spominje int x; //float x; string x;... x = a + b; Je li x deklariran prije prve upotrebe? x je ispravan izraz ako se nalazi npr. u kontekstu int x; (float, string...) Postoje li imena koja se koriste a nisu deklarirana?
Semantička analiza primjeri Na koju se deklaraciju x odnosi? int suma(int x, int y) { int x = 2; return x + y; } Je li izraz dosljedan u tipovima? float pi = 3.14159; string s = pi je ; cout << s + pi << endl;
Semantička analiza primjeri Gdje možemo pohraniti x? hrpa, stog,... Da li *p referencira rezultat malloc()-a (ili operatora new)? int *p; *p = 13; int *p; p = new int; *p = 13; Je li x definiran prije prve upotrebe (ne samo deklariran)? float f; cout << f << endl; float f; f = 1.23; cout << f << endl;
Semantička analiza primjeri Jesu li indeksi unutar polja u odgovarajućim granicama? double d[10] = {5.55}; d[23] = 4.44; d[10] = 9.0; Da li funkcija f vraća konstantnu vrijednost? Na sljedeća pitanja ne možemo odgovoriti kontekstno neovisnom (slobodnom) gramatikom
Sintaksa i semantika Sintaksa određuje ispravan oblik programa Sintaksa se obično definira kao ono što se može provjeriti kontekstno neovisnom gramatikom Ipak, neke stvari koje liče na sintaksu, ne mogu biti opisane KNG-om Npr. provjera broja argumenata u funkcijskim pozivima Semantika određuje ponašanje / značenje / smisao (sintaksno) ispravnog oblika programa U praksi je semantika sve što zahtijeva usporedbu s drugim linijama koda
Sematička analiza Statička semantika Analizira se u trenutku prevođenja Jesu li sve varijable deklarirane? Jesu li svi izrazi odgovarajućih tipova? Je li broj parametara u funkcijskim pozivima korektan? Dinamička semantika
Sematička analiza Statička semantika Analizira se u trenutku prevođenja Dinamička semantika Analizira se u trenutku pokretanja programa Da li se možda dijeli s nulom? cin >> f; cout << 10/f << endl; Je li indeks polja u odgovarajućem rasponu? cin >> i; cout << polje[i];
Semantička analiza Za razliku od KNG koje smo koristili za sintaksnu analizu, semantička analiza zbog oslanjanja na kontekst traži nešto više: Kontekstno ovisne (osjetljive) gramatike Primjer: izraz i je ispravan u kontekstu int i; KOG su teške za primjenu, pa se koristi alternativa: Simboličke tablice Centralno mjesto za pohranu informacija Apstraktno sintaksno stablo Atributne gramatike koristi ih YACC Dizajn jezika Pojednostavljenje jezika da bismo izbjegli probleme
Simbolička tablica Za efikasno prevođenje najčešće se koristi simbolička tablica Leksičkim jedinkama se pridružuju atributi Prate se sljedeće leksičke jedinke: Varijable Konstante Funkcije Nizovi Tekstualne oznake (label) Privremene varijable koje stvara prevodilac
Simbolička tablica Za efikasno prevođenje najčešće se koristi simbolička tablica Prate se sljedeća svojstva leksičkih jedinki: varijable: ime, tip, vrijednost tipovi: opis tipa, veličina, poredak bajtova konstante: ime, tip, vrijednost funkcije: ime, tip, tip rezultata, broj parametara lokalne deklaracije
Atributna gramatika Uljepšana kontekstno neovisna gramatika Atributna gramatika dozvoljava produkcijama da budu obogaćene semantičkim atributima i operacijama Nezavršnim znakovima gramatike pridružuje atribute E ima npr. atribut val Produkcijama pridružuje pravila E 1 E 2 + T E 1.val = sum (E 2.val, T.val)
Atributna gramatika Kopiranje vrijednosti E T E.val = T.val
Primjer: Binarni brojevi Cijeli Decimalni Nezavršni znakovi: num, string i bit Mogući atributi: Num: val String: val, len Bit: val
Primjer: (1) num string 1. string 2 num.val := string 1.val + string 2.val/2 ^ string 2.len (2) num string num.val := string.val (3) string 0 string 1 bit string 0.val := 2*string 1.val + bit.val string 0.len := string 1.len + 1 (4) string bit string.val := bit.val string.len := 1 (5) bit 0 bit.val := 0 (6) bit 1 bit.val := 1
Semantička analiza Semantička analiza povezuje faze analize izvornog i sinteze ciljnog programa Ciljevi semantičkog analizatora: Određivanje značenja sintaksnih cjelina Provjera semantičkih pravila Priprema podataka ostalim dijelovima jezičnog procesora
Zadaci semantičkog analizatora Popunjavanje tablice znakova vrijednostima obilježja sintaksnih cjelina Prijenos vrijednosti obilježja po sintaksnom stablu Određivanje početnih uvjeta Određivanje mjesta i opisa semantičkih pogrešaka Obrađivanje makro naredbi
Određivanje značenja Određivanje značenja sintaksnih cjelina je središnji zadatak semantičkog analizatora Značenje se određuje svim elementima jezika Od leksičkih jedinki...... do najsloženijih sintaksnih cjelina
Primjer: značenje identifikatora Imena varijabli, polja, konstanti, potprograma itd. Značenje varijable određuje se na temelju podatkovnog tipa Cjelobrojne, realne, znakovne, logičke, tekstualne Značenje polja određuje se na temelju značenja indeksa i elemenata polja Značenje potprograma određuje se na temelju značenja ulaznih i izlaznih parametara
Primjer: značenje složenih Npr. izrazi i naredbe sintaksnih struktura U C=A+B značenje varijable C određuje se na temelju značenja varijabli A i B A i B cjelobrojne C cjelobrojna A i B znakovne C znakovna Osim značenja od C, određuje se i značenje izraza A+B i značenje operatora + + može biti zbrajanje cijelih brojeva, konkatenacija stringova, zbrajanje matrica
Semantička analiza Značenje leksičkih jedinki i sintaksnih cjelina koristi određena obilježja, a obilježja poprimaju vrijednost značenja Npr. varijablama kao leksičkim jedinkama i izrazima kao sintaksnim cjelinama dodjeljuje se obilježje podatkovni tip, a to obilježje može poprimiti vrijednost cijeli broj, decimalni broj, skup, matrica, itd.
Semantičko okruženje Tijekom semantičke analize potrebno je ispitati šire programsko okruženje CijeliBroj A; CijeliBroj B; CijeliBroj C;... C = A + B;... Program je leksički, sintaksno i semantički ispravan
Semantičko okruženje CijeliBroj A; Znak B;... C = A + B;... Program je leksički i sintaksno ispravan, ali nije semantički Ne možemo zbrojiti znakovnu i cjelobrojnu varijablu Ne možemo odrediti značenje izraza A+B, tj. značenje operatora + koji prima znak i cijeli broj
Semantička pravila Neka semantička pravila moguće je definirati primjenom produkcija KNG Umjesto definiramo <izraz> IDN + IDN <izraz> <IntIzraz> <CharIzraz> <FltIzraz> <BoolIzraz> <IntIzraz> INT + INT <CharIzraz> CHAR + CHAR <BoolIzraz> BOOL + BOOL <FltIzraz> FLOAT + FLOAT FLOAT + INT INT + FLOAT...gdje su izrazi bez <> završni znakovi
Semantička pravila Uobičajeno je da se pravila jezika obuhvaćena produkcijama gramatike ugrade u sintaksni analizator Zato je ponekad teško razlučiti sintaksna i semantička pravila jezika
Popunjavanje tablice znakova U tablicu znakova zapisuju se vrijednosti obilježja sintaksnih cjelina Npr. tablica identifikatora popunjava se vrijednostima obilježja: Vrsta identifikatora Varijabla, polje, konstanta, potprogram, parametar Podatkovni tip identifikatora Cjelobrojni, decimalni, znakovni, logički, tekstualni Djelokrug (doseg) identifikatora Područje programa u kojem vrijedi deklaracija
Popunjavanje tablice znakova Vrijednosti obilježja se u tablicu znakova upisuju postepeno CijeliBroj A; CijeliBroj B;... C = A + B;... Na početku se zapisuje da su A i B cjelobrojne varijable Tijekom analize izraza A+B leksički analizator pridružuje varijablama A i B kazaljke koje pokazuju na tablicu identifikatora u kojoj su zapisane vrijednosti obilježja od A i B Budući da u i A i B cjelobrojne, semantički analizator pridružuje varijabli C značenje cjelobrojne varijable, a operatoru + značenje cjelobrojnog zbrajanja
Prenošenje vrijednosti obilježja Vrijednosti obilježja sintaksnih cjelina možemo prenijeti pomoću: Sintaksnog stabla vrijednosti obilježja pridružujemo čvorovima sintaksnog stabla Stoga dijelovi sintaksnog stabla dinamički se spremaju na stog Semantički analizator može izgraditi vlastiti stog, ili vrijednosti obilježja može nadopuniti na podatke upisane na prethodno izgrađeni sintaksni stog
Semantička analiza tanka je granica između semantičke analize i generiranja međukoda semantička analiza se ponekad smatra fazom sinteze...... a ponekad se i generiranje međukoda smatra fazom analize
Kontekstno ovisna gramatika Gramatika G=(V,T,P,S) je kontekstno ovisna ako su joj sve produkcije oblika αaβ αγβ A V(tj. A je jedan nezavršni znak), α,β (N U Σ)* (tj. α i β su nizovi nezavršnih i završnih znakova) γ (N U Σ)+ (tj. γ je neprazni niz završnih i nezavršnih znakova).
Kontekstno ovisna gramatika Kao dodatak, produkcija oblika S ε pri čemu ε predstavlja prazni niz je dozvoljena ako se S ne pojavljuje na desnoj strani neke od produkcija iz P Nezavršni znak A se može zamijeniti s γ akko se A nalazi u kontekstu α/β, tj. akko se ispred γ nalazi niz znakova α, a iza niz znakova β
Primjer: a n b n c n Neka je gramatika G zadana produkcijama 1. S asbc 2. S abc 3. CB HB 4. HB HC 5. ab ab 6. bb bb 7. bc bc 8. cc cc G je kontekstno ovisna i definira jezik a n b n c n Npr. u produkciji 7. se C pretvara u c samo u kontekstu b
Primjer: aaabbbccc 1. S asbc 2. S abc 3. CB HB 4. HB HC 5. ab ab 6. bb bb 7. bc bc 8. cc cc
Slobodna gramatika Gramatika neograničenih produkcija Gramatika G=(V,T,P,S) je slobodna ako su joj sve produkcije oblika α,β (N U Σ)* α β tj. α i β su nizovi nezavršnih i završnih znakova α nije jednak ε
Primjer: a n b n c n Neka je gramatika G zadana produkcijama 1. S absc 2. S abc 3. Ba ab 4. Bb bb G definira jezik a n b n c n G nije niti regularna, niti konteksno neovisna, niti konteksno ovisna
Hijerarhija automata i gramatika Regularna gramatika Kontekstno neovisna gramatika Kontekstno ovisna gramatika Gramatika neograničenih produkcija Konačni automat Potisni automat Linearno ograničeni automat Turingov stroj Regularni jezici Kontekstno neovisni jezici Kontekstno ovisni jezici Rekurzivno prebrojivi jezici
Chomskyjeva hijerahija Regularni jezici Deterministički kontekstno neovisni jezici w2w R Nedeterministički kontekstno neovisni jezici ww R Kontekstno ovisni jezici ww Rekurzivno prebrojivi jezici Rekurzivni jezici Univerzalni jezik Svi jezici nad 2 Σ* Dijagonalni jezik
2. kolokvij Stvari obrađene na predavanjima i vježbama (ne sve iz navedenih skripti) [JP1] do str.126 [JP2] do str.170 Zadaće Neka mi se mailom jave studenti koji nisu prikupili bodove iz zadaće, a žele ih prikupiti Termin 2. kolokvija F3 razred umjesto F2
Literatura Siniša Srbljić: Jezični procesori 1 [JP1] Siniša Srbljić: Jezični procesori 2 [JP2]