Compilatoare. Curs 4 Analiza semantica

Σχετικά έγγραφα
Curs 14 Funcţii implicite. Facultatea de Hidrotehnică Universitatea Tehnică "Gh. Asachi"

Metode iterative pentru probleme neliniare - contractii

Curs 10 Funcţii reale de mai multe variabile reale. Limite şi continuitate.

(a) se numeşte derivata parţială a funcţiei f în raport cu variabila x i în punctul a.

V.7. Condiţii necesare de optimalitate cazul funcţiilor diferenţiabile

5. FUNCŢII IMPLICITE. EXTREME CONDIŢIONATE.

Curs 1 Şiruri de numere reale

a n (ζ z 0 ) n. n=1 se numeste partea principala iar seria a n (z z 0 ) n se numeste partea

Analiza în curent continuu a schemelor electronice Eugenie Posdărăscu - DCE SEM 1 electronica.geniu.ro

Laborator 11. Mulţimi Julia. Temă

Metode de interpolare bazate pe diferenţe divizate

riptografie şi Securitate

Sisteme diferenţiale liniare de ordinul 1

Integrala nedefinită (primitive)

SEMINAR 14. Funcţii de mai multe variabile (continuare) ( = 1 z(x,y) x = 0. x = f. x + f. y = f. = x. = 1 y. y = x ( y = = 0

Planul determinat de normală şi un punct Ecuaţia generală Plane paralele Unghi diedru Planul determinat de 3 puncte necoliniare

Curs 4 Serii de numere reale

DISTANŢA DINTRE DOUĂ DREPTE NECOPLANARE

III. Serii absolut convergente. Serii semiconvergente. ii) semiconvergentă dacă este convergentă iar seria modulelor divergentă.

Functii definitie, proprietati, grafic, functii elementare A. Definitii, proprietatile functiilor

Criptosisteme cu cheie publică III

Functii definitie, proprietati, grafic, functii elementare A. Definitii, proprietatile functiilor X) functia f 1

prin egalizarea histogramei

Seminar 5 Analiza stabilității sistemelor liniare

5.5. REZOLVAREA CIRCUITELOR CU TRANZISTOARE BIPOLARE

Definiţia generală Cazul 1. Elipsa şi hiperbola Cercul Cazul 2. Parabola Reprezentari parametrice ale conicelor Tangente la conice

Componente şi Circuite Electronice Pasive. Laborator 3. Divizorul de tensiune. Divizorul de curent

Examen AG. Student:... Grupa:... ianuarie 2011

COLEGIUL NATIONAL CONSTANTIN CARABELLA TARGOVISTE. CONCURSUL JUDETEAN DE MATEMATICA CEZAR IVANESCU Editia a VI-a 26 februarie 2005.

Functii Breviar teoretic 8 ianuarie ianuarie 2011

Seminariile Capitolul X. Integrale Curbilinii: Serii Laurent şi Teorema Reziduurilor

RĂSPUNS Modulul de rezistenţă este o caracteristică geometrică a secţiunii transversale, scrisă faţă de una dintre axele de inerţie principale:,

MARCAREA REZISTOARELOR


2. Circuite logice 2.4. Decodoare. Multiplexoare. Copyright Paul GASNER

TEMA 9: FUNCȚII DE MAI MULTE VARIABILE. Obiective:

Subiecte Clasa a VIII-a

Aplicaţii ale principiului I al termodinamicii la gazul ideal

Asupra unei inegalităţi date la barajul OBMJ 2006

Erori si incertitudini de măsurare. Modele matematice Instrument: proiectare, fabricaţie, Interacţiune măsurand instrument:

V O. = v I v stabilizator

SERII NUMERICE. Definiţia 3.1. Fie (a n ) n n0 (n 0 IN) un şir de numere reale şi (s n ) n n0

5.4. MULTIPLEXOARE A 0 A 1 A 2

R R, f ( x) = x 7x+ 6. Determinați distanța dintre punctele de. B=, unde x și y sunt numere reale.

Laborator 1: INTRODUCERE ÎN ALGORITMI. Întocmit de: Claudia Pârloagă. Îndrumător: Asist. Drd. Gabriel Danciu

Conice. Lect. dr. Constantin-Cosmin Todea. U.T. Cluj-Napoca

Proiectarea Algoritmilor 2. Scheme de algoritmi Divide & Impera

Subiecte Clasa a VII-a

f(x) = l 0. Atunci f are local semnul lui l, adică, U 0 V(x 0 ) astfel încât sgnf(x) = sgnl, x U 0 D\{x 0 }. < f(x) < l +

VII.2. PROBLEME REZOLVATE

Ecuaţia generală Probleme de tangenţă Sfera prin 4 puncte necoplanare. Elipsoidul Hiperboloizi Paraboloizi Conul Cilindrul. 1 Sfera.

Fig Impedanţa condensatoarelor electrolitice SMD cu Al cu electrolit semiuscat în funcţie de frecvenţă [36].

Capitolul 4. Integrale improprii Integrale cu limite de integrare infinite

1 INTRODUCERE - ORGANIZAREA UNUI COMPILATOR ELEMENTE DE TEORIA LIMBAJELOR FORMALE... 7

Esalonul Redus pe Linii (ERL). Subspatii.

Curs 2 DIODE. CIRCUITE DR

Ecuatii exponentiale. Ecuatia ce contine variabila necunoscuta la exponentul puterii se numeste ecuatie exponentiala. a x = b, (1)

Limbaje de Programare Curs 3 Iteraţia. Reprezentare internă. Operatori pe biţi

Arhitectura Calculatoarelor. Fizică - Informatică an II. 2. Circuite logice. Copyright Paul GASNER 1

Lectia VI Structura de spatiu an E 3. Dreapta si planul ca subspatii ane

TAD Stiva (STACK) Observaţii: 1. sunt aşezate ordonat unele peste altele. Un element nou se adaugă în stivă deasupra elementului cel mai recent

EDITURA PARALELA 45 MATEMATICĂ DE EXCELENŢĂ. Clasa a X-a Ediţia a II-a, revizuită. pentru concursuri, olimpiade şi centre de excelenţă

Problema a II - a (10 puncte) Diferite circuite electrice

Valori limită privind SO2, NOx şi emisiile de praf rezultate din operarea LPC în funcţie de diferite tipuri de combustibili

Compilatoare. Analiza sintactică - LR

a. 11 % b. 12 % c. 13 % d. 14 %

Curs 4. I.4 Grafuri. Grafuri orientate

Componente şi Circuite Electronice Pasive. Laborator 4. Măsurarea parametrilor mărimilor electrice

Concurs MATE-INFO UBB, 1 aprilie 2017 Proba scrisă la MATEMATICĂ

2.1 Sfera. (EGS) ecuaţie care poartă denumirea de ecuaţia generală asferei. (EGS) reprezintă osferă cu centrul în punctul. 2 + p 2

Universitatea din Bucureşti Facultatea de Matematică şi Informatică. Algebră (1)

Profesor Blaga Mirela-Gabriela DREAPTA

Examen AG. Student:... Grupa: ianuarie 2016

II. 5. Probleme. 20 c 100 c = 10,52 % Câte grame sodă caustică se găsesc în 300 g soluţie de concentraţie 10%? Rezolvare m g.

Foarte formal, destinatarul ocupă o funcţie care trebuie folosită în locul numelui

Cursul Măsuri reale. D.Rusu, Teoria măsurii şi integrala Lebesgue 15

Subiecte Clasa a V-a

* K. toate K. circuitului. portile. Considerând această sumă pentru toate rezistoarele 2. = sl I K I K. toate rez. Pentru o bobină: U * toate I K K 1

Curs 4. RPA (2017) Curs 4 1 / 45

Lucrare. Varianta aprilie I 1 Definiţi noţiunile de număr prim şi număr ireductibil. Soluţie. Vezi Curs 6 Definiţiile 1 şi 2. sau p b.

Proiectarea filtrelor prin metoda pierderilor de inserţie

Ecuatii trigonometrice

Măsurări în Electronică şi Telecomunicaţii 4. Măsurarea impedanţelor

Exemple de probleme rezolvate pentru cursurile DEEA Tranzistoare bipolare cu joncţiuni

Declaraţii de variabile, tipuri, funcţii

Capitolul 14. Asamblari prin pene

CIRCUITE LOGICE CU TB

a) (3p) Sa se calculeze XY A. b) (4p) Sa se calculeze determinantul si rangul matricei A. c) (3p) Sa se calculeze A.


, semestrul 2. Curs 2

Metode Runge-Kutta. 18 ianuarie Probleme scalare, pas constant. Dorim să aproximăm soluţia problemei Cauchy

2. Circuite logice 2.2. Diagrame Karnaugh. Copyright Paul GASNER 1

Capitolul 4 PROPRIETĂŢI TOPOLOGICE ŞI DE NUMĂRARE ALE LUI R. 4.1 Proprietăţi topologice ale lui R Puncte de acumulare

1.7. AMPLIFICATOARE DE PUTERE ÎN CLASA A ŞI AB

Εμπορική αλληλογραφία Ηλεκτρονική Αλληλογραφία

III. Reprezentarea informaţiei în sistemele de calcul

MULTIMEA NUMERELOR REALE

Spatii liniare. Exemple Subspaţiu liniar Acoperire (înfăşurătoare) liniară. Mulţime infinită liniar independentă

Orice izometrie f : (X, d 1 ) (Y, d 2 ) este un homeomorfism. (Y = f(x)).

Compilatoare. Generarea codului obiect

Transcript:

Compilatoare Curs 4 Analiza semantica

ANALIZA SEMANTICA Calculeaza toate atributele asociate nodurilor din arborele sintactic Atributele terminalilor se seteaza de obicei direct din analiza lexicala Restul analizei semantice se face in timpul parsarii Ex: Tipul si valoarea unei constante Ex: Numele si tipul unei variabile Verifica daca structurile sintactic corecte au sens dpdv semantic Gaseste erori semantice (toate erorile de compilare care nu sunt erori de sintaxa)

Exemple de erori semantice Erori de definitie variabile, functii, tipuri folosite fara a fi definite In unele limbaje avem definitii implicite. var a = 10; se poate deduce tipul din context? Rezolvare la timpul compilarii (limbaje statice), sau la rulare (limbaje dinamice). Erori de structura X.y=A[3] X trebuie sa fie structura/clasa cu campul y, A trebuie sa fie array/pointer foo(3, true, 8) trebuie sa fie o functie ce accepta 3 parametri

Exemple de erori semantice Erori de tip a +5. Compatibilitatea tipurilor. Ex: in Pascal, doar tipurile identice; in C, tipurile cu aceeasi structura ; in C++/Java, subclasele sunt compatibile cu superclasele Unele limbaje accepta conversii automate de tip 3 + 45 =? (48? 345?) Strongly / weakly typed. Erori de acces private/protected;const

Arbori: derivare vs. sintactic O gramatică "comodă" din punctul de vedere al analizei sintactice se poate dovedi "incomodă" din punctul de vedere al stabilirii regulilor semantice datorita transformarilor suferite Parserul descopera un arbore de derivare. Facem analiza semantica pe arborii sintactici!

Cateva definitii Gramatica independenta de context + reguli de calcul ale atributelor = definiţie orientată sintaxă (syntax directed definition). Daca funcţiile utilizate în calculul de atribute nu au efecte laterale -> gramatică de atribute Definitie orientata sintaxa + detalii de implementare = schemă de traducere. A Fie urmatorul arbore de derivare: A.a = f(x.a, Y.a, Z.a) atribut sintetizat Y.a = F(A.a, X.a, Z.a) atribut mostenit X Y Z

Definite orientata sintaxa Dupa ce am stabilit gramatica limbajului Pentru fiecare simbol din gramatică se asociază un atribut (eventual cu mai multe campuri) Pentru fiecare producţie se asociază o mulţime de reguli semantice (cum calculam valoarea atributelor) Gramatica + reguli semantice => definitie orientata sintaxa Pt o productie A X1... Xk regulile semantice sunt de forma: A.a:= f(x1.a,..., Xk.a) Xi.a:= f(a.a, X1.a,..., Xk.a), cu Xi neterminal

Exemplu: 9-5+2 expr expr.t = 9 5-2 + / \ / \ / \ / \ expr.t = 95- expr term term.t = 2 / / \ + / \ 2 / \ expr.t = 9- expr term term.t = 5 - term.t = 9 term 5 9 Producţie expr expr1 + term expr expr1 term expr term term 0 Translatarea expresiilor in forma postfixata Acţiune expr.t:= expr1.t term.t '+' expr.t:= expr1.t term.t '-' expr.t:= term.t term.t:= '0'......

Scheme de traducere O schema de traducere GIC + actiuni semantice (definitie orientata sintaxa) Momentul in care act. semantice sunt executate in timpul parsarii O specificare posibilă utilizează fragmente de program reprezentând acţiuni semantice intercalate între simbolii care apar în partea dreaptă a producţiilor: A -> α { print('x')} β se va afişa caracterul 'x' după ce se vizitează subarbo-rele α şi înainte de traversarea subarborelui β. Un nod care reprezintă o acţiune semantica nu are descendenţi iar acţiunea semantică se execută atunci când este întâlnită în parcurgerea arborelui.

Exemplu: 9-5+2 expr expr + term expr -> expr + term {print('+')} expr -> expr - term {print('-')} expr -> term term -> NR {print($1)} 2 print ( 2 ) expr - term print( + ) term 5 print( 5 ) print( - ) 9 print ( 9 )

Graful de dependenta Definitiile orientate sintaxa nu precizeaza cand se aplica regulile semantice Dar se precizeaza cum depind unele de altele Dacă un atribut depinde de un alt atribut c, atunci regula semantică pentru calculul atributului b trebuie să fie evaluată după regula semantică care îl produce pe c Graful de dependenta Noduri = atribute Arc n1->n2 : n2 se calculeaza pe baza n1

Exemplu float a, b, c; L.tip depinde de T.tip, addvar() depinde de L.tip L.tip, id.nume sunt mostenite T.tip e sintetizat Producţie D -> T L; T -> int Regula semantică (acţiune) L.tip = T.tip T.tip = int T -> float T.tip = float Definitie orientata sintaxa, nu gramatica de atribute (addvar) L -> L 1, id L 1.tip = L.tip; addvar(id.nume, L.tip) L -> id addvar(id.nume, L.tip)

Calculul atributelor Ordinea de calcul ordinea topologica pe graful de dependenta Se construieste arborele de derivare, apoi graful de dependenta pentru toate atributele, apoi se sorteaza topologic si rezulta o ordine de calcul a atributelor Calculul atributelor este posibil numai dacă graful de dependenţă este necircular. Conteaza ordinea de evaluare? Nu, pentru gramaticile de atribute Da, pentru schemele de traducere

Calculul atributelor (cont.) int a,b; D D T.tip = int L.tip=int add(a,int) T L int L.tip=int add(a,int) id.name=b int L id id.name=a id

Calculul atributelor Dandu-se o definitie orientata sintaxa, este graful necircular pentru orice arbore de derivare? Algoritm exponential in cazul general Se restrictioneaza regulile de calcul ale atributelor Evaluare in timpul parsarii Algoritmi care garanteaza ordinea de evaluare

Definitii S-atributate Producţie Regula semantică (acţiune) E E 1 + T E.s:= Nod( +, E 1.s, T.s); E E 1 - T E T T num E.s:= Nod( -, E 1.s, T.s); E.s:=T.s T.s:= Nod(num.val)

Definitii S-atributate (cont.) E + E + T - 3 E - T 3 1 2 T 2 1 1-2+3

Definitii S-atributate (cont.) Doar atribute sintetizate Stiva e imbogatita cu informatii legate de atributele neterminalilor recunoscuti De câte ori se face o reducere, valorile atributelor sintetizate sunt calculate pornind de la atributele care apar în stivă pentru simbolii din partea dreaptă a producţiei. Naturale in analiza ascendenta, dar si in analiza descendenta

Definitii S-atributate (cont.) Analiza descendent recursiva expr returns [int value] : e=term {$value = $e.value;} ( '+' e=term {$value += $e.value;} )*; int Expr() { int e = Term(), value = e; while (lookahead() == PLUS) { match(plus); e = Term(); value += e; } // verify lookahead here return value; } Dar intr-un automat cu stiva?

Definitii S-atributate Analiza ascendenta expr : expr '+' term { $$ = $1 + $3; } term { $$ = $1; } ; Cod executat la reduce: switch (state) { case 3: value = stack[top - 2] + stack[top]; break; case 4: value = stack[top]; break; } pop(stack, 3); push(stack, value); Care e continutul stivei? Ce cod se genereaza pentru shift?

Definitii L-atributate Producţie E T R Regula semantică (acţiune) R.m:= T.s; E.s = R.s R - T R 1 R 1.m:= Nod('- ', R.m, T.s); R.s = R 1.s R + T R 1 R 1.m:= Nod('+', R.m, T.s); R.s = R 1.s R ε T num R.s:= R.m T.s:= Nod(num.val)

Definitii L-atributate (cont.) E + T R - 3 1 - T R 1 2 2 + T R 3 1-2+3

Definitii L-atributate (cont.) Orice atribut calculat printr-o regulă semantică asociată producţiei A -> X 1 X 2...X n este fie sintetizat, fie este un atribut moştenit pentru neterminalul X j care depinde numai de atributele simbolilor X 1, X 2,... X j-1 şi de atributele moştenite pentru A Includ definitiile S-atributate Naturale in analiza descendenta

Definitii L-atributate Analiza descendent recursiva R + T R 1 R 1.m:= Nod('+', R.m, T.s); R.s = R 1.s R λ R.s:= R.m Nod R(Nod m) { if (lookahead() == PLUS) { MATCH(PLUS); Nod t = T(); Nod r = R(new Nod(PLUS, m, t)); } else r = R(m); return r; }

Implementare in analiza ascendenta E -> TR R -> +T { print('+') } R -T { print('-') } R λ T -> numar { print(numar.val) } Putem să rescriem schema de traducere sub forma: E -> TR E -> +T M R -T N R λ T -> numar {print(numar.val)} M -> λ {print('+')} N -> λ {print('-')} Ambele scheme de traducere reprezintă aceeaşi gramatică şi toate acţiunile sunt executate în aceeaşi ordine. Prin introducerea unor simboli neterminali suplimentari am reuşit să îndeplinim condiţia de a avea acţiunile semantice la sfârşitul producţiei

Implementare (cont.) Putem considera cunoscuta structura stivei T apare intotdeauna in stiva inaintea lui L Putem folosi addvar(id.nume, Previous(stack).tip). Producţie D-> T L; T -> int T -> float Regula semantică (acţiune) L.tip = T.tip T.tip = int T.tip = float Pt. atributele sintetizate,pozitia se stie; pt cele mostenite, e tricky L -> L 1, id L 1.tip = L.tip; addvar(id.nume, L.tip) L -> id addvar(id.nume, L.tip)

Implementare (cont.) Solutia anterioara nu e generica. T nu mai apare intotdeauna in stiva inaintea lui L Putem modifica gramatica: D -> T : X L X -> λ X.tip = T.tip L.tip = T.tip Producţie D-> T : L; D-> TL; T -> int T -> float L -> L 1, id Regula semantică (acţiune) L.tip = T.tip L.tip = T.tip T.tip = int T.tip = float L 1.tip = L.tip; addvar(id.nume, L.tip) L -> id addvar(id.nume, L.tip)

Implementare (cont.) Probleme daca gramatica nu e LL(1) A 1 ->A 2 x {A 2.m = f(a 1.m);} y {y.i=f(a 1.m);} Introducem neterminali: A->M1 Ax M2 y M1-> λ M2-> λ Apare conflict reduce-reduce M1-M2 Y e in FOLLOW(M1) si in FOLLOW(M2)

Ce poate contine un atribut? Un sub-arbore sintactic Valoarea unei expresii (evaluare/interpretare) Tipul unei expresii Cod intermediar / final generat Syntax-directed translation

Atribute folosite in translatare I if C then I 1 else I 2 C E I.Cod = C(x a, x b ); x a : I 1 ; goto x c x b : I 2 x c : C(x true, x false ).Cod = if E==true goto x true goto x false C C 1 and E C(x true, x false ).Cod = C 1 (x n, x false ); x n :if E==true goto x true goto x false C C 1 or E C(x true, x false ).Cod = C 1 (x true, x n ); x n :if E==true goto x true goto x false

Analiza semantica, in practica Practic, pe noi ne intereseaza sa adnotam arborele sintactic cu informatia de tip sa construim tabela (tabelele) de simboli sa modificam arborele (daca e nevoie) prin inserarea de noduri type-cast Mare parte din analiza semantica se refera la management-ul contextelor

Contexte Contextele pastreaza definitiile/declaratiile curente Numele si structura tipurilor Numele si tipul variabilelor Numele, tipul de return, numarul si tipul parametrilor pentru functii Pe masura ce variabilele/functiile/tipurile etc sunt declarate, sunt adaugate la contextul curent Cand variabilele(functii, tipuri) sunt accesate, se verifica definitia din contextul curent

Contextele si spatiile de nume Tipurile si variabilele au spatii de nume diferite in limbaje diferite: In C: typedef int foo; foo foo; // e legal int int; // e ilegal int e cuvant rezervat In Java Integer Integer = new Integer(4); // e legal Ilegal in C, legal in Java: int foo(x) { return x+4;} int f(){ int foo=3; return foo(foo);} E totusi nerecomandat chiar daca e legal!!!

Implementarea contextelor Se face cu ajutorul tablelor de simboli Actiuni pentru tabela de simboli: Deschide un context nou. Adauga o pereche cheie=valoare Cauta valoarea unei chei, daca sunt mai multe intoarce-o pe cea din contextul cel mai recent Inchide contextul sterge toate perechile cheie=valoare din context. Concret implementare cu stiva sau hashtable

Implementarea contextelor(2) Varianta 1: cu stiva. In fiecare context avem cate o tabela de simboli. Exista o stiva de contexte deschise, si cautarea unui simbol se face in din varful catre baza stivei Varianta2: cu hashtable. Avem o singura tabela de simboli, in care avem nume_identificator + nr. context. La inchiderea unui context, se sterg toti identificatori cu numarul respectiv.

Contexte statice sau dinamice Nu sunt o problema in C/C++/Java In pascal avem contexte statice (o functie imbricata in alta functie poate accesa variabilele locale ale functiei mama ). In lisp avem contexte dinamice (se acceseaza variabile din functia apelanta)

Tipuri Un tip e setul de valori + operatiile permise pe valorile respective; 3 categorii: Tipuri simple/de baza: int, float, double, char, bool tipuri primitive, de obicei exista suport hardware direct pentru ele de ex. registri dedicati). Si enum intra aici. Tipuri compuse array, pointer, struct, union, class, etc. Obtinute prin compunerea tipurilor de baza cu tipuri compuse simple (array/pointer) Tipuri complexe liste,arbori de obicei suportate prin biblioteci, nu direct de limbaj

Informatii despre tipuri La tipurile de baza, nu avem nevoie de informatie suplimentara (exceptie: enum) Tipurile de baza sunt create by default Variabilele au un pointer la tip Tipurile compuse Au nevoie de o lista de nume de campuri, cu tipul lor Poate fi tinuta ca si context! Expresii de tip

Informatii despre tipuri (continuare) Array Tipul de baza, numarul de elemente Eventual range-ul indicilor, pentru array-uri declarate static Pentru array-urile multidimensionale fiecare dimensiune e un nou tip! Pointeri Tipul de baza (poate fi tot pointer) Adnotari pe toate tipurile const, restricted, etc. Creaza un nou tip! Sunt si adnotari ce influenteaza doar variabilele (de ex. static ).

Verificarea de tip Verifica daca operatiile executate respecta sistemul de tipuri al limbajului Orice nerespectare eroare de tip Daca toate erorile de tip pot fi verificate la compilare limbajul este strongly typed. Erori minore conversii implicite Verificare de tip Statica la compilare C, Pascal Dinamica la runtime Perl, Python, Ruby

Verificarea de tip Sinteza Determinarea tipului unei constructii (e.g. expresie) pornind de la tipurile membrilor (subexpresii) Daca f are tipul S X x S Y x T si x are tipul S X, y are tipul S Y atunci f(x,y ) are tipul T Overloading pentru functii si operatori Inferenta Determinarea tipului unei constructii din context.

Actiuni din analiza semantica Declaratii -> adauga info. in tabela de simboli; daca nu gaseste tipul, raporteaza eroare Declaratii array pot produce tipuri noi Instructiuni/constructii: verifica regulile specifice fiecarei instructiuni A=b; -> a si b exista? au tipuri compatibile? Prototipuri de functii ->

Echivalenta tipurilor compuse Se tine informatia de tip sub forma de arbore Echivalenta de nume; structurala Se verifica recursiv echivalenta pe arbore Atentie la tipuri recursive!

Tipuri compatibile, subtipuri int compatibil cu double nu neaparat in ambele directii!! Conversii implicite vs. explicite Widening / Narrowing Subtip poate fi folosit oricand in locul tipului parinte Enum in C Mostenire in C++ Atentie la mostenirea privata!

Constructii care au tip asociat Constantele Variabilele Functiile Expresiile Instructiunile De ex. if asteapta o expresie de tip bool Tipul void Tipuri+constructii+reguli generale = sistem de tipuri

Inferenta de tipuri Deducerea tipului unei expresii din context La compilare sau la rulare. De ce? Verificarea tipurilor Function overloading, generics/templates Introducerea de conversii implicite Declaratii simplificate, tipuri ad-hoc

Inferenta de tipuri Function overloading void f(int) { } void f(char) { } f(3.14); // Se pot aplica conversii? Generics / Templates template<t> f(t a, T* b) { } int x[]; f(x[0], x);

Inferenta de tipuri Declaratii simplificate, tipuri ad-hoc map<int,list<string>> m; map<int,list<string>>::iterator i = m.begin(); //C++ auto i = m.begin(); // C++0x Dictionary<int, string> d = new Dictionary<int, string>(); var d = new Dictionary<int, string>(); var p1 = new { Name = "Lawnmower", Price = 495.00 }; var p2 = new { Name = "Shovel", Price = 26.95 }; p1 = p2; Se sintetizeaza tipul expresiei din dreapta, se infera tipul expresiei din stanga.

Inferenta functiilor polimorfice fun lungime(lptr) = if null(lptr) then 0 else lungime(tl(lptr)) + 1; Limbaj functional ML Ce tip intoarce functia lungime? Null si tl ( tail ) opereaza pe liste.

Expresii de tip lungime: ß; // ß, γ sunt variabile de tip lptr : γ; if : α, boolean x α x α α; //functie polimorfica null : α, list(α) boolean; tl : α, list(α) list(α) 0 : integer; 1 : integer; + : integer x integer integer; match : α, α x α α; match ( lungime(lptr), if (null(lptr), 0, lungime(tl(lptr)) + 1) ) // pseudo-operator sunt tipurile echivalente?

Inferenta functiilor polimorfice Substitutie si unificare lungime: γ δ ; lptr : γ; if : α, boolean x α x α α; null : α, list(α) boolean; tl : α, list(α) list(α) + : integer x integer integer; match : α, α x α α; match ( lungime(γ), if (boolean, integer, lungime(tl(γ)) + integer) )

Inferenta functiilor polimorfice Substitutie si unificare lungime: γ δ ; lptr : γ; if : α, boolean x α x α α; tl : α, list(α) list(α) + : integer x integer integer; match : α, α x α α; match ( lungime(γ), if (boolean, integer, lungime(tl(γ)) + integer) ) match(lungime(tl(γ)) + integer, integer) match(tl(γ), list (β))

Inferenta functiilor polimorfice Substitutie si unificare lungime: β, list(β) integer ; // Din if( ) lptr : list(β); // Din tl( ) if : α, boolean x α x α α; tl : α, list(α) list(α) + : integer x integer integer; match : α, α x α α; match ( lungime(list(β)), if (boolean, integer, lungime(list(β)) + integer) ) match(lungime(list(α)), integer) // Din +

Unificare - algoritmul Unificare(s,t) daca (s==t) ok daca s, t sunt tipuri compuse similare, s=f(s1,s2), t=f(t1,t2) Inlocuieste s cu t s si t vor face parte din aceeasi clasa de echivalenta Unificare(s1,t1) && Unificare(s2,t2); daca s e o variabila inlocuieste s cu t; ok daca t e o variabila inlocuieste t cu s; ok altfel unificarea nu e posibila