This shows you the differences between two versions of the page.
cpl:teme-draft:t2-draft-2015 [2016/10/04 07:13] bogdan.nitulescu removed |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ==T2 Draft== | ||
- | |||
- | În cadrul acestei teme veti implementa atât analiza semnatică pentru limbajul LCPL. | ||
- | |||
- | ===== Informaţii organizatorice ===== | ||
- | |||
- | * **Deadline**: Termenul limită până când se pot trimite temele fără depunctări de întârziere este **vineri, 4 decembrie 2015, ora 23:59**. Pentru mai multe detalii, consultaţi [[:cpl:teme:general|regulamentul]] aferent temelor de casă. | ||
- | * **Colaborare**: Tema va fi rezolvată **individual**. | ||
- | * **Punctare**: 125p pentru implementarea completă şi corectă | ||
- | |||
- | |||
- | ===== Enunţ ===== | ||
- | |||
- | Va trebui să realizaţi în limbajul C++, porţiunea responsabilă cu analiza semantică a codului rezultat in urma temei 1. Programul vostru va trebui să primească la intrare output-ul temei 1 şi să genereze [...], in cazul in care analiza semnatica nu a detectat erori, sau o lista de erori. | ||
- | |||
- | ===== Analiza Semantica ===== | ||
- | |||
- | În cadrul analizei semantice va trebui să colectați informații semantice (de ex. tipul expresiilor) și să verificați că programul reprezentat de AST-ul construit la tema 1 respectă restricțiile impuse de limbajul LCPL (a se consulta în acest sens manualul). Analiza va avea doua scopuri: | ||
- | |||
- | 1) Obținerea informațiilor ce sunt necesare pentru generarea de cod: | ||
- | * Tipul fiecărei expresii, variabile locale, metode, parametru formal sau atribut | ||
- | * Clasa de baza a fiecarei clase derivate. | ||
- | * Pentru fiecare simbol folosit, se va identifica variabila pe care il refera (locala, parametru formal, atribut) | ||
- | * Pentru fiecare apel de metoda, se vor identifica metoda care va fi apelata si clasa din care face parte. | ||
- | |||
- | |||
- | 2) Verificarea corectitudinea definirii structurii de clase a programului. Câteva exemple de probleme care ar trebui semnalate la acest pas: | ||
- | * definirea unei clase de mai multe ori sau redefinirea uneia de bază - deja implementată în arhiva de pornire | ||
- | * moștenirea unui tip care nu poate avea succesori (String, Int) - deja implementată în arhiva de pornire | ||
- | * absența unei clase Main cu metoda main - deja implementată în arhiva de pornire | ||
- | * moșteniri recursive (A moștenește B care moștenește A) | ||
- | * variabilă sau clasă nedefinită | ||
- | * metodă inexistentă sau apel nevalid (de ex. ca nr. de parametri) | ||
- | * incompatibilitate de tipuri (între operanzi și operator, în argumentele unei funcții etc.) | ||
- | |||
- | În procesul de a obține informațiile din primul paragraf, puteți întâlni erori, cum sunt cele exemplificate in al doilea paragraf. Aceste erori trebuie raportate ca erori semantice. | ||
- | |||
- | ===== Arhiva de pornire ===== | ||
- | |||
- | Arhiva initiala ({{:cpl:teme:lcpl-semant-1.0.tgz|lcpl-semant-1.0.tgz}}) conține o implementare parțială a analizei semantice pentru LCPL. Ceea ce trebuie să faceți este să identificați porțiunile lipsa (marcate cu un comentariu **TODO** in cod ) și să completați cu logica necesară conform indicațiilor de acolo. | ||
- | |||
- | Porțiunile lipsă se găsesc în fișierele **src/SemanticAnalysis.cpp** si **src/TypeTable.cpp** . Puteți modifica sau adăuga și alte fișiere, dar nu este neapărat necesar. Dacă simțiți nevoia unui fișier #include suplimentar, puteți folosi **include/SemanticAnalysisImpl.h** . | ||
- | |||
- | Framework-ul conține: | ||
- | * **include/*.h** - structurile de date pentru AST | ||
- | * **src/SymbolTable.cpp** - implementarea unei tabele de simboli | ||
- | * **src/TypeTable.cpp** - implementarea unei liste de tipuri, și câteva funcții ajutătoare | ||
- | * **src/SemanticAnalysis** - implementarea analizei semantice folosind visitor pattern. Clasa conține o funcție visit pentru fiecare nod din AST. | ||
- | |||
- | |||
- | ===== Testare ===== | ||
- | Pentru a putea face un build și a rula testele, aveți nevoie de o mașină Linux cu pachetele //gcc//, //automake// si //cmake// instalate. | ||
- | |||
- | Puteți urma pașii de mai jos: | ||
- | |||
- | <code> | ||
- | tar zxf lcpl-semant-1.0.tgz # Extrageți conținutul arhivei | ||
- | cd lcpl-semant | ||
- | cmake . # Utilitarul CMake va crea Makefile-uri pentru build și teste | ||
- | make # Build pentru teste și analiză sintactică | ||
- | make run-hello # Rulează testul hello.lcpl | ||
- | make run-all # Rulează toate testele | ||
- | </code> | ||
- | |||
- | <note important>//Out of the box//, dacă rulați **make run-parent_loop** așa cum vine din arhiva de pornire, programul se blochează într-o buclă infinită. Este un bug care va trebui fixat de către voi, adăugând cod care verifică dacă ierarhia de clase este corectă!</note> | ||
- | |||
- | Pentru ca implementarea este incompleta, o parte din teste trec, o alta parte din teste esueaza. Scopul vostru este sa faceti in final sa treaca toate testele. | ||