This is an old revision of the document!


Tema de casă 2 - Analiza semantică și generarea de cod

Î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 duminică, 6 decembrie 2015, ora 23:59. Pentru mai multe detalii, consultaţi 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

  • Pentru testele pozitive: PASS daca programul este corect; FAIL, insotit de o descriere si linia erorii, daca este incorect.
  • Pentru testele negative: PASS daca analiza sintactică întoarce eroarea așteptată; FAIL dacă analiza sintactică nu detectează eroarea sau detectează un alt tip de eroare.

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 (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.
  • tests/error/*TestRig.cpp - unit teste pentru cazurile de eroare din suita de teste.

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:

 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

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ă!

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().

cpl/teme/tema2.1448484051.txt.gz · Last modified: 2015/11/25 22:40 by bogdan.nitulescu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0