interpretacija programa semanti ka analiza - web.math.pmf...

43
Interpretacija programa Semantička analiza Krunoslav Puljić 2013/2014

Upload: others

Post on 06-Sep-2019

11 views

Category:

Documents


0 download

TRANSCRIPT

Interpretacija programaSemantič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

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)

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 → 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

Literatura

• Siniša Srbljić: Jezični procesori 1 [JP1]• Siniša Srbljić: Jezični procesori 2 [JP2]