This is an old revision of the document!
În cadrul acestei teme veti implementa atât analiza semnatică pentru limbajul LCPL.
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.
Î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:
2) Verificarea corectitudinea definirii structurii de clase a programului. Câteva exemple de probleme care ar trebui semnalate la acest pas:
Î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 initiala (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:
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:
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
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.