Documente Academic
Documente Profesional
Documente Cultură
Tema3
De la POO
Salt la: Navigare, cutare Responsabili: Adriana DRAGHICI Mihnea MURARU Data publicarii: 15-12-2012, ora 17:00 Data ultimei modificari: Termenul de predare: 13-01-2013, ora 23:59 Obiective urmarite: dezvoltarea unei aplicatii practice, utilizand design pattern-ul Visitor
Cuprins
[ascunde] [ascunde] 1 Introducere 2 Scopul temei 3 Cerinte 3.1 Arborele de parsare 3.2 Analiza semantica 3.3 Evaluarea expresiilor 4 Precizari generale 5 Incarcarea temelor 6 Notare
[modific] Introducere
In general, compilatoarele, indiferent de limbajul pe care il trateaza, parcurg un fisier sursa (sau mai multe), efectueaza o serie de prelucrari asupra acestuia, pentru ca in final sa obtina un set de instructiuni simple ce vor fi executate de procesor (ADD, OR, XOR etc.). Enumeram cateva din prelucrarile cele mai importante realizate de compilator: transformarea codului sursa intr-o forma logica (arborele de parsare - parse tree) ce sa evidentieze structura acestuia. In acest sens, un cod sursa orientat obiect este transformat intr-un arbore cu o radacina generica, avand drept copii clasele programului. Copii unei clase sunt metodele si variabilele membru. Copiii unei metode sunt instructiunile s.a.m.d. pe baza parse tree-ul astfel construit, compilatorul poate sa: verifice daca programul contine erori (ex.: constructia int n = "sir"; este eronata) realizeze optimizari asupra programului (ex.: secventa c = 5; b = c + 0; va fi transformata de compilator in: b = 5;) genereze codul masina pentru rularea programului translateze acest cod intr-un alt limbaj (ex.: conversia de la cod Java la cod JavaScript)
file:///C|/Users/Mihnea/Desktop/Tema3%20-%20POO.htm[02.01.2013 18:02:57]
Tema3 - POO
Din punct de vedere conceptual, orice proces de compilare poate fi "spart" in doua etape fundamentale: obtinerea unui arbore de parsare realizarea unei parcurgeri specifice a acestuia, in functie de scopul urmarit
Operatorii pentru tipul integer sunt: + (adunare) * (inmultire). Operatorii pentru tipul boolean sunt: + (SAU logic) * (SI logic). Pe langa acestea, mai avem operatorul de atribuire, =. Drept operanzi putem avea: variabile: a, b, x etc. valori concrete (literali): intregi pozitivi: 2, 15 etc. booleeni: true , false . Limbajul NU include: paranteze declaratii de tip (de genul int a). Tipul unei variabile va fi dedus din tipul expresiei care i se atribuie. Exemplu: din instructiunea a = 2 + 3, rezulta ca a are tipul integer. Scopul temei consta in a construi un compilator al acestui limbaj. Numele fisierului de intrare va fi dat ca parametru in linia de comanda. Fiecare instructiune se gaseste pe cate o linie .
[modific] Cerinte
Tema poseda 3 parti, detaliate in cele ce urmeaza: arborele de parsare
file:///C|/Users/Mihnea/Desktop/Tema3%20-%20POO.htm[02.01.2013 18:02:57]
Tema3 - POO
este
Pentru constructia arborelui de parsare puteti folosi alogritmul anexat (nu este obligatoriu). Definiti o ierarhie de clase care sa modeleze un arbore de parsare (Parse Tree) pentru acest limbaj. Ierarhia va avea drept varf clasa Node . Din ea veti deriva cate o clasa pentru fiecare tip de nod de arbore ( Variabila , Valoare, OperatorEgal, OperatorPlus etc. - numele nu sunt impuse). Clasa Node va retine (folosind colectiile Java) lista nodurilor copil . In clasa Node implementati o metoda de afisare a arborelui ( in adancime ); aceasta va afisa subarborele cu radacina in nodul curent. Apeland metoda pentru nodul radacina, se va afisa intregul arbore. Afisati arborele de parsare in fisierul <fisier_intrare>_pt . Exemplu : Daca fisierul de intrare are numele in.txt, fisierul de iesire va avea numele in.txt_pt . Exemplu de formatare a afisarii pentru programul anterior:
file:///C|/Users/Mihnea/Desktop/Tema3%20-%20POO.htm[02.01.2013 18:02:57]
Tema3 - POO
Folositi tab-uri ( \t) pentru indentare. In fata unui nod se va afisa un numar de tab-uri egal cu adancimea sa in arbore. Radacina are adancime 0. Precizare: Se considera ca programul este CORECT din punct de vedere sintactic; nu exista erori de sintaxa de genul:
a = 5 + b = + c 5
E2
a = 3 c = a + b (b nedeclarata la linia 2 coloana 9)
E3
a = 3 b = false c = a + b (+ intre tipuri incompatibile la linia 3 coloana 7)
Erorile vor fi afisate, cate una pe linie, intr-un fisier intitulat <fisier_intrare>_sv . Exemplu: Daca fisierul de intrare are numele in.txt, fisierul de iesire va avea numele in.txt_sv . Atentie ! Pentru a inlesni testarea automata, mesajele de eroare vor fi exact cele mentionate in parantezele de mai sus! Fiecare mesaj va contine linia si coloana in care s-a identificat problema: Linia - reprezinta linia din fisierul de intrare (numerotarea liniilor incepe de la 1) Coloana - reprezinta pozitia din cadrul liniei a token-ului care a generat eroare (numerotarea
file:///C|/Users/Mihnea/Desktop/Tema3%20-%20POO.htm[02.01.2013 18:02:57]
Tema3 - POO
coloanelor incepe de la 1). Se vor lua in considerare si spatiile albe . Pentru simplitate, vom presupune ca toti token-ii sunt delimitati prin exact 1 spatiu (ca in cazurile de mai sus). De exemplu, pentru programul:
a a c b a e = = = = = = true 3 false a + c true + b 1 * c * a
output-ul este:
+ intre tipuri incompatibile la linia 4 coloana 7 b nedeclarata la linia 5 coloana 12 * intre tipuri incompatibile la linia 6 coloana 7
Din cele de mai sus, se observa: o variabila poate fi redefinita ( a = true , apoi a = 3, caz in care tipul sau se schimba de la boolean la integer ) daca nu se poate determina tipul unei expresii, cum este in cazul a + c, definitia esueaza . In exemplul nostru, b ramane nedefinit, fapt semnalat in expresia true + b, care il refera intereseaza doar erorile "independente" : pentru o expresie oarecare, nu mai semnalam eroare daca am semnalat deja una pentru o subexpresie a ei. In exemplul de mai sus, o data semnalat faptul ca b este nedefinit, nu mai semnalam ca nu putem realiza "adunarea" in expresia true + b in expresia e = 1 * c * a, avem o inmultire intre tipuri compatibile; in functie de constructia arborelui de parsare, putem identifica fie: * intre tipuri incompatibile la linia 6 coloana 7 (depistam eroarea la inmultirea lui 1 cu c) * intre tipuri incompatibile la linia 6 coloana 11 (depistam eroarea la inmultirea lui c cu a) Oricare dintre cele doua erori semnalate este corecta, insa nu amandoua simultan Pentru programul de mai jos:
a = 1 * z + 2 * z
output-ul este:
z nedeclarata la linia 1 coloana 9 z nedeclarata la linia 1 coloana 17
Ambele erori sunt afisate deoarece cele doua subexpresii sunt independente . Precizari: In vizitator va trebui sa retineti un dictionar in care sa asociati fiecarei variabile tipul acesteia ( integer sau boolean) (utilizati Map ). Definiti o interfata Visitor, cu cate o metoda visit pentru fiecare clasa derivata din clasa Node . SemanticVisitor va implementa aceasta interfata.
file:///C|/Users/Mihnea/Desktop/Tema3%20-%20POO.htm[02.01.2013 18:02:57]
Tema3 - POO
de intrare are numele in.txt, fisierul de iesire va avea numele in.txt_rv . Pentru programul:
a b c d b e = = = = = = 3 4 5 a + b * c b + 1 true * false
output-ul va fi:
a b c d e = = = = = 3 5 5 23 false
[modific] Notare
Notarea se va efectua dupa urmatoarea schema:
file:///C|/Users/Mihnea/Desktop/Tema3%20-%20POO.htm[02.01.2013 18:02:57]
Tema3 - POO
90 puncte - acordate de testerul automat; 5 puncte - existenta javadocurilor; 5 puncte - calitatea codului, a comentariilor si a readme-ului - apreciate de asistent. Pentru notare se va folosi acest tester, toate testele fiind publice. Gasiti in fisierul readme.txt din arhiva detalii de intrebuintare. Daca testerul acorda 0 puncte, atunci acesta va fi punctajul pentru intreaga tema, indiferent de indeplinirea celorlalte cerinte! Temele care nu compileaza nu vor fi luate in considerare. Temele trimise inainte de aparitia testerului nu fac exceptie de la aceasta regula. Pentru fiecare zi de intarziere se vor scadea cate 5/100 puncte. Dupa 14 zile de la trecerea termenului nu se vor mai putea incarca arhive pe site. Adus de la "http://cursuri.cs.pub.ro/~poo/wiki/index.php/Tema3"
Vizualizri
Pagina principal Portalul comunitii Discut la cafenea Schimbri recente Pagin aleatorie Ajutor
Caut
Du-te
Caut
Trusa de unelte
file:///C|/Users/Mihnea/Desktop/Tema3%20-%20POO.htm[02.01.2013 18:02:57]
Tema3 - POO
Ultima modificare 15:01, 15 decembrie 2012. Aceast pagin a fost vizitat de 5.022 ori. Coninutul este disponibil sub GNU Free Documentation License 1.2. Politica de confidenialitate Despre POO Termeni
file:///C|/Users/Mihnea/Desktop/Tema3%20-%20POO.htm[02.01.2013 18:02:57]