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
Î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.
(25.11.2015) Un test se consideră trecut corect dacă nu aruncă nicio excepție la rulare, și prin urmare afișează PASS. Testele din directorul error sunt diferite - la rularea lor, analizorul semantic trebuie să arunce un anumit tip de excepție. Pentru a putea vedea care este acea excepție, trebuie să analizați fișierul tests/error/test-nameTestRig.cpp și să observați cazul pe care se execută metoda pass().