This shows you the differences between two versions of the page.
cpl:teme:tema1 [2015/10/27 21:40] raluca.grigoras [FAQ] |
cpl:teme:tema1 [2017/11/28 05:51] (current) bogdan.nitulescu [Informaţii organizatorice] |
||
---|---|---|---|
Line 8: | Line 8: | ||
===== Informaţii organizatorice ===== | ===== Informaţii organizatorice ===== | ||
- | * **Deadline**: Termenul limită până când se pot trimite temele fără depunctări de întârziere este **marți, 10 noiembrie 2015, ora 23:59**. Pentru mai multe detalii, consultaţi [[:cpl:teme:general|regulamentul]] aferent temelor de casă. | + | * **Deadline**: Termenul limită până când se pot trimite temele fără depunctări de întârziere este **luni, 15 ianuarie 2018, ora 23:59**. Pentru mai multe detalii, consultaţi [[:cpl:teme:general|regulamentul]] aferent temelor de casă. |
* **Colaborare**: Tema va fi rezolvată **individual**. | * **Colaborare**: Tema va fi rezolvată **individual**. | ||
- | * **Punctare**: În funcţie de varianta de implementare aleasă se vor acorda diverse punctaje: | + | * **Punctare**: 125p, din care |
* 100p pentru implementarea completă şi corectă a analizei sintactice | * 100p pentru implementarea completă şi corectă a analizei sintactice | ||
- | * 125p pentru implementarea operațiilor pe vectori în limbajul LCPL | + | * 25p pentru implementarea operațiilor pe vectori în limbajul LCPL |
===== Enunţ ===== | ===== Enunţ ===== | ||
Line 18: | Line 18: | ||
Va trebui să realizaţi în limbajul C++, folosind Flex și Bison, porţiunea responsabilă cu analiza lexicală şi sintactică a codului sursă pentru un compilator al limbajului LCPL. Programul vostru va trebui să primească la intrare codul sursă LCPL şi să furnizeze la ieşire informaţii (un AST) pentru analiza semantică. | Va trebui să realizaţi în limbajul C++, folosind Flex și Bison, porţiunea responsabilă cu analiza lexicală şi sintactică a codului sursă pentru un compilator al limbajului LCPL. Programul vostru va trebui să primească la intrare codul sursă LCPL şi să furnizeze la ieşire informaţii (un AST) pentru analiza semantică. | ||
- | Documentaţia principală în cadrul acestei teme va fi {{:cpl:teme:lcpl-manual.pdf | manualul limbajului LCPL}}. Rezultatul programului realizat de voi va fi folosit de restul compilatorului în temele următoare. | + | Documentaţia principală în cadrul acestei teme va fi {{:cpl:teme:lcpl_manual_2.0.pdf | manualul limbajului LCPL}}. Rezultatul programului realizat de voi va fi folosit de restul compilatorului în temele următoare. |
==== Analiza lexicală ==== | ==== Analiza lexicală ==== | ||
Line 96: | Line 96: | ||
} | } | ||
</code> | </code> | ||
+ | |||
===== Prezentarea arhivei ===== | ===== Prezentarea arhivei ===== | ||
- | Pentru a rezolva această temă va trebui să porniţi de la **{{:cpl:teme:tema1-arhiva.zip|această arhivă}}**. | + | Pentru a rezolva această temă va trebui să porniţi de la **{{:cpl:teme:arhiva-tema1.zip|această arhivă}}**. |
Structura arhivei este următoarea: | Structura arhivei este următoarea: | ||
Line 107: | Line 108: | ||
* ''lcpl-AST/src'' - implementarea funcționalității de serializare în format JSON | * ''lcpl-AST/src'' - implementarea funcționalității de serializare în format JSON | ||
* ''test'' - trei programe simple scrise in LCPL | * ''test'' - trei programe simple scrise in LCPL | ||
- | * ''Makefile'' - Secvența de comenzi necesară pentru a compila biblioteca ce oferă arborele sintactic și parserul | + | * ''CMakeLists.txt'' - Folosită pentru generarea Makefile-urilor continand secvența de comenzi necesară pentru a compila biblioteca ce oferă arborele sintactic și parserul |
* ''README'' - Descrieți implementarea voastră în acest fișier. | * ''README'' - Descrieți implementarea voastră în acest fișier. | ||
Line 121: | Line 122: | ||
===== Vectori ===== | ===== Vectori ===== | ||
+ | Extindeți limbajul LCPL prin adăugarea unui tip de date vector. Acest tip de date va fi folosit conform sintaxei din exemplele următoare. | ||
- | Implementarea operațiilor pe vectori va fi punctată doar dacă varianta de **100 de puncte** este implementată corect si complet. | + | * declararea unui vector de siruri de caractere, inițializat cu null. |
- | + | ||
- | Implementarea **NU** trebuie să introducă noduri noi în AST, ci trebuie să funcţioneze cu AST-ul existent. | + | |
- | + | ||
- | <note tip> | + | |
- | Cum limbajul LCPL nu suportă implicit operații pe obiecte de tip vector, va trebui să vă definiți o clasă ajutătoare pentru a simula aceste funcționalități; puteţi apoi ca în timpul parsării să adugaţi codul acestei clase la fişierul LCPL primit la intrare. Clasa trebuie implementată folosind doar facilităţile oferite de limbajul LCPL de bază. | + | |
- | + | ||
- | Sugerăm ca acest cod LCPL suplimentar scris de voi să fie plasat în arhivă într-un fișier numit **''src/Vector.lcpl''**.</note> | + | |
- | + | ||
- | ==== Sintaxă ==== | + | |
- | + | ||
- | Sintaxa obiectelor de tip vector ar trebui să fie compatibilă cu exemplele următoare: | + | |
- | + | ||
- | * declararea unui vector de siruri de caractere | + | |
<code java> | <code java> | ||
String[] myArray; | String[] myArray; | ||
</code> | </code> | ||
- | * instanțierea unui obiect vector: | + | * funcție ce are ca parametru un vector și întoarce un vector. |
+ | <code java> | ||
+ | init sort String[] anArray -> String[]; | ||
+ | </code> | ||
+ | * instanțierea unui nou obiect de tip vector: | ||
<code java> | <code java> | ||
myArray = new String[8]; | myArray = new String[8]; | ||
Line 152: | Line 145: | ||
</code> | </code> | ||
- | Nu este necesar să suportaţi array-uri de tip Int, însă va trebui să introduceţi în AST noduri de tip CAST necesare pentru compatibilitatea tipurilor. | + | Nu este necesar să implementați vectori de tip Int, însă va trebui să puteți avea vectori din orice tip derivat din Object, nu doar String. |
==== Exemplu de utilizare ==== | ==== Exemplu de utilizare ==== | ||
Line 184: | Line 177: | ||
class Main inherits IO | class Main inherits IO | ||
var | var | ||
- | Stack stack = [(new Stack).init 8]; | + | StringStack stack = [(new StringStack).init 8]; |
end; | end; | ||
main : | main : | ||
Line 194: | Line 187: | ||
</code> | </code> | ||
+ | ==== Implementare ==== | ||
+ | |||
+ | In LCPL, vectorii nu fac parte din limbajul de bază, ci sunt doar o extensie de sintaxă (//Syntax Sugar//). | ||
+ | |||
+ | Implementarea **NU** trebuie să introducă noi tipuri de noduri în AST, ci trebuie să se folosească doar de clasele și nodurile existente. Practic va trebui să simulați vectorii folosind o altă structură de date. | ||
+ | |||
+ | <note tip> | ||
+ | Cum limbajul LCPL nu suportă implicit operații pe obiecte de tip vector, va trebui să vă definiți o clasă ajutătoare pentru a simula aceste funcționalități; puteţi apoi ca în timpul parsării să adugaţi codul acestei clase la fişierul LCPL primit la intrare. Clasa trebuie implementată folosind doar facilităţile oferite de limbajul LCPL de bază. | ||
+ | |||
+ | Sugerăm ca acest cod LCPL suplimentar scris de voi să fie plasat în arhivă într-un fișier numit **''src/Vector.lcpl''**.</note> | ||
+ | |||
+ | Nu uitați să introduceţi în AST noduri de tip CAST necesare pentru compatibilitatea tipurilor. | ||
Line 218: | Line 223: | ||
**A:** De la clasa "Program". Conține o listă de "Class", care conține o listă de "Feature", ce pot fi "Attribute" sau "Method" ... și așa mai departe. | **A:** De la clasa "Program". Conține o listă de "Class", care conține o listă de "Feature", ce pot fi "Attribute" sau "Method" ... și așa mai departe. | ||
+ | |||
+ | Pentru a înțelege mai bine ierarhia nodurilor din arbore și care sunt structurile de date corespunzătoare, puteți încărca fișierele *.ast.ref din arhiva de teste într-un viewer de JSON. | ||
**Q:** Cum tratăm erorile sintactice? | **Q:** Cum tratăm erorile sintactice? | ||
Line 232: | Line 239: | ||
===== Download ===== | ===== Download ===== | ||
- | * **{{:cpl:teme:lcpl-manual.pdf|Manualul}}** limbajului LCPL. | + | * **{{:cpl:teme:lcpl_manual_2.0.pdf|Manualul}}** limbajului LCPL. |
- | * **{{:cpl:teme:tema1-arhiva.zip|Arhiva}}** de pornire pentru rezolvarea temei. | + | * **{{:cpl:teme:arhiva-tema1.zip|Arhiva}}** de pornire pentru rezolvarea temei. |
* **{{:cpl:teme:tema1-teste.zip|Set de teste}}** conținând fișiere LCPL și AST-ul corespunzător. | * **{{:cpl:teme:tema1-teste.zip|Set de teste}}** conținând fișiere LCPL și AST-ul corespunzător. | ||
+ | |