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, 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 […], 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 (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:

 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.

cpl/teme/tema2.1448381648.txt.gz · Last modified: 2015/11/24 18:14 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