interpretacija programa semanti ka analiza - web.math.pmf...
TRANSCRIPT
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
Leksičkianalizator
Semantičkianalizator
Sintaksnianalizator
Tablica znakova
Nizleksičkihjedinki
Sintaksnostablo
Izvorniprogram
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
Mnemonik2IzracunajCijenu()
{
ako (Kolicina >20)
Cijena = 1000;
inace
Cijena = 1200;
NovaCijena = Cijena;
}
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
00 ako
01 onda
02 inace
... ...
20 >
21 =
... ...
40 ;
41 (
42 )
43 {
44 }
... ...
60 IzracunajCijenu
61 Kolicina
... ...
75 20
Tablica znakova
Pomak
Leksička jedinka
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◦ E1 → E2 + T
� E1.val = sum (E2.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 → string1 . string2
� num.val := string1.val + string2.val/2 ^ string2.len
• (2) num → string� num.val := string.val
• (3) string0 → string1 bit� string0.val := 2*string1.val + bit.val � string0.len := string1.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 sintaksnih struktura
• Npr. izrazi i naredbe• 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
• Program je leksički, sintaksno i semantički ispravan
CijeliBroj A;CijeliBroj B;CijeliBroj C;...C = A + B;...
Semantičko okruženje
• 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
CijeliBroj A;Znak B;...C = A + B;...
Semantička pravila
• Neka semantička pravila moguće je definirati primjenom produkcija KNG
• Umjesto definiramo
• ...gdje su izrazi bez <> završni znakovi
<izraz> →→→→ IDN + IDN
<izraz> →→→→ <IntIzraz> | <CharIzraz> | <FltIzraz> | <BoolIzraz>
<IntIzraz> →→→→ INT + INT<CharIzraz> →→→→ CHAR + CHAR<BoolIzraz> →→→→ BOOL + BOOL<FltIzraz> →→→→ FLOAT + FLOAT | FLOAT + INT |
INT + FLOAT
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
� 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
CijeliBroj A;CijeliBroj B;...C = A + B;...
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: anbncn
• Neka je gramatika G zadana produkcijama1. S → aSBC2. S → aBC3. CB → HB4. HB → HC5. aB → ab6. bB → bb7. bC → bc8. cC → cc
• G je kontekstno ovisna i definira jezik anbncn
� Npr. u produkciji 7. se C pretvara u c samo u kontekstu b
Primjer: aaabbbccc
1. S → aSBC2. S → aBC3. CB → HB4. HB → HC5. aB → ab6. bB → bb7. bC → bc8. 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: anbncn
• Neka je gramatika G zadana produkcijama� 1. S → aBSc� 2. S → abc� 3. Ba → aB� 4. Bb → bb
• G definira jezik anbncn
• G nije niti regularna, niti konteksno neovisna, niti konteksno ovisna
Gramatika neograničenih produkcija
Kontekstno ovisna gramatika
Kontekstno neovisnagramatika
Hijerarhija automata i gramatika
Regularnagramatika
Turingov stroj
Linearno ograničeni automat
Potisni automat
Konačniautomat
Rekurzivno prebrojivi jezici
Kontekstno ovisni jezici
Kontekstno neovisnijezici
Regularnijezici
Chomskyjeva hijerahija
• Regularni jezici• Deterministički kontekstno neovisni jezici
� w2wR
• Nedeterministički kontekstno neovisni jezici� wwR
• 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