Administrativ
Laboratoare
Tema
Teste
Resurse utile
Alte resurse
Arhiva Teme
Administrativ
Laboratoare
Tema
Teste
Resurse utile
Alte resurse
Arhiva Teme
Pentru a le dovedi colegilor de la Facultatea de Litere că și ei se pricep la literatură, studenții de la Calculatoare au început să scrie cod în limbajul SPL (Shakespeare Programming Language). Aceștia și-au dat însă seamă că nu au un mod de a rula noile lor programe deoarece nu există un tool care să le compileze sau să le interpreteze codul. Deoarece sunt harnici și le place POO, studenții au decis să își scrie propriul interpretor de SPL în Java. \m/
Va trebui să creați un arbore sintactic (AST) pornind de la structura limbajului Shakespeare.
Odată creat AST-ul va trebui afisat si interpretat. Pentru asta vom folosi Visitor Pattern. Puteți folosi ce obiecte de tip Visitable și de tip Visitor considerați necesare. Este obligatorie folosirea pattern-ului atât pentru interpretare cât și pentru afișare.
Punctaj (100p)
SPL este un limbaj de programare cu o structură fixă, menită să semene cu piesele de Shakespeare. In varianta restrânsă pe care o implementăm în temă, acesta va avea doar instrucțiuni aritmetice și de afișare la consolă. Nu există structuri de date sau clase. Limbajul SPL definește o serie de cuvinte cu semnificație specifică programului. Orice alte cuvinte nu vor însemna nimic și sunt ignorate.
Printre cuvintele specifice limbajului SPL distingem:
în cadrul acestui Limbaj substantivele reprezintă constante cu valori de 1 sau -1 în funcție de conotația lor. Un substantiv precum “hero” este considerat pozitiv și va avea valoarea 1. Altul precum “devil” este considerat negativ și va avea valoarea -1. Cele neutre de asemenea se consideră a fi 1 (exemplu: “tree”). Pentru a vă da seama de valoarea lor vom avea liste predefinite de cuvinte, astfel în funcție de lista din care face parte vom cunoaște valoarea asociată.
în SPL adjectivele împreună cu substantivele definesc constante. Un substantiv prefixat cu un adjectiv va fi multiplicat cu 2. Astfel numărul de adjective prefixate în fața unui substantiv va conduce la o formulă de forma: val = (2 « nr_adj) * noun
In cadrul arhivei care conține scheletul se va regăsi directorul “wordlists” care va conține toate listele de keyword-uri. Nu este necesară folosirea specifică a fiecărui wordlist, fiecare student poate alege cum va trata (sau nu va trata) diferite cuvinte dintr-o listă anume.
In schelet vă este pus la dispoziție un parser pentru a distinge cuvintele cu semnificație pentru limbajul SPL. Acesta se găsește în clasa Parser și are metoda getNext(). Aceata metodă va returna pentru fiecare cuvânt din text un obiect de tip Token. Un Token este format din valoarea efectivă (cuvântul respectiv) și tipul ei. Există un tip pentru fiecare listă din “wordlists”.
Spre exemplu cuvântul “evil” va returna un Token t, care va avea t.value = “evil” și t.type = TYPE.negative_adjective. Dacă un cuvânt nu se va regăsi în wordlist va avea tipul TYPE.irrelevant
Orice program în SPL începe cu un titlu. Titlul se termină la întâlnirea primului caracter punct ‘.’. Titlul este considerat un comentariu și poate conține orice caracter diferit de punct (“.”) de oricâte ori, pe oricâte linii.
După titlu, în program sunt declarate personajele. Acestea sunt de fapt variabile de tip signed integer. Nu vom întâlni variabile cu alt tip. Toate variabilele pe care le vom folosi trebuie declarate în această secțiune a programului astfel:
NAME, DESCRIPTION.
unde
După declarațiile de variabile, în program urmează o serie de acte și scene. Un program are unul sau mai multe acte, fiecare act are una sau mai multe scene.
O scenă începe cu specificarea personajelor care vor juca în ea. în fiecare scenă trebuie să existe obligatoriu fix 2 personaje. Instrucțiunea prin care facem acest lucu este Enter.
La sfârșitul scenei unele din personaje pot ieși (instrucțiunea Exit). Pentru a scoate din scenă toate personajele folosim instrucțiunea Exeunt. Nu este obligatoriu să scoatem personaje din scenă la terminarea acesteia. Personajele rămase în scenă vor continua să joace în scena următoare. Numai personajele aflate în scenă pot spune replici.
Actele și scenele se declară astfel:
Act NUMBER : DESCRIPTION . Scene NUMBER : DESCRIPTION .
unde
Pentru a putea spune replici, personajele trebuie să se afle pe scenă. Personajele adresează alte personaje la persoana a doua prin cuvintele cheie precum “you” sau “thou”. Personajele adresate trebuie de asemenea să se afle pe scenă.
Pentru a aduce personaje în scenă folosim instrucțiunea “Enter” urmată de unul sau două personaje.
[ Enter CHAR1 and CHAR2 ]
Pentru a scoate personaje din scenă folosim instrucțiunea “Exit” urmată de un singur personaj.
[ Exit CHAR ]
Pentru a scoate mai multe sau toate personajele de pe scenă se folosește “Exeunt”:
[ Exeunt ] - ies toate personajele din scenă [ Exeunt CHAR ] - iese personajul menționat din scenă [ Exeunt CHAR1 and CHAR2 ] - ies personajele menționate din scenă
Când se află pe scenă personajele pot spune replici. Replicile pot fi:
Aceste instrucțiuni afișează valoarea unei variabile, deci cea a unui personaj, la consolă. Există 2 variante:
în cadrul SPL constantele (ex 5, 17, 42 etc.) sunt definite în modul următor, în funcție de un substantiv și numărul de adjective prefixate acestuia. Un substantiv poate avea doar două valori de bază : 1 sau -1. Substantivele cu conotație pozitivă sau neutră sunt considerate 1 , restul -1. Pentru fiecare adjectiv cu care sunt prefixate acestea se inmultuesc cu 2. Să luăm următoarele exemple:
Pornind de la aceste constante putem în continuare construi operații matematice în forma Polish Notation (aka. Polish Prefix Notation). Să luăm un exemplu
the difference between the square of the difference between my little pony and your big hairy hound and the cube of your sorry little codpiece
- (^2) - 2 4 (^3) -4
4 - (-64) = 68
Atribuirile se vor face într-o formă similară. Există în principiu 2 feluri de atribuiri:
You lying stupid fatherless big smelly half-witted coward !
You are as stupid as the difference between a handsome rich brave hero and thyself !
Notând personajul cu care vorbim cu X, replica precedentă se va transforma în X = 8 - X. Unde prin al doilea X înțelegem valoarea variabilei în acel moment (X_next = 8 - X_current). A se observa ca în atribuiri putem avea în partea stângă numai variabile (caractere) și în partea dreaptă fie o variabilă, fie o constantă numerică, fie instrucțiuni aritmetice.
Pornind de la specificațiile de mai sus, va trebui să construiți un arbore sintactic pentru un program SPL. Fiecare tip de operație și Act/Scenă va fi reprezentată de un tip de nod specific în arborele sintactic. Să luăm un exemplu simplu, pentru următorul program:
A Genius Play by a Genius Man . Romeo , a young man with a remarkable patience . Juliet , random chick . Ophelia , some other chick . Hamlet , third wheel . Act I : The Act of Luuuuv . Scene I : Our First Scene . [ Enter Romeo and Juliet ] Romeo: Empty scene with no important lines. Life is sad. [ Exit Juliet ] Scene II : Second Scene . [ Enter Ophelia ] Ophelia: We do not like compilers... [ Exit Romeo ] Scene III : The Sound of Silence . [ Enter Hamlet ] [ Exeunt ] Act II : Shakespeare strikes back . Scene I : The Praising of Alex . [ Enter Ophelia and Hamlet ] Hamlet: Students love this homework . You stupid lying bastard . Open your heart ! [ Exeunt ] Scene II : The Murder of Alex . [ Enter Romeo sadsa Hamlet ] Romeo: His death shall be slow and painful , horribly slower than the horribly slow murder with an extremely inefficient weapon . [ Exeunt ] Scene III : The Glory of the Spoon . [ Enter Gigel Ophelia ] Ophelia: Who is Gigel ? He is not a Shakespeare character . OMG ! [ Exeunt ]
Structură arbore:
Programele SPL vor fi citite din folderul tests
. In folderul tests
se vor afla fisierele de test (test1.spl
,test2.spl
, etc). Parser-ul din schelet primește calea către fișierul de intrare și îl citește.
Interpretorul va trebui să creeze 2 fișiere in folderul output
pentru fiecare test:
Structura arborelui va fi scrisă in fisierul testx.ast astfel:
AssignmentNode LvalNode character_name ConstantNode integer_value SAU RvalNode character_name SAU nod_operatii_aritmetice
OutputNode integer_value
SumNode DifferenceNode ConstantNode 4 ConstantNode 5 ConstantNode -3
Fisierele de iesire pentru exemplul de mai sus (example.spl) sunt urmatoarele:
-4
ProgramNode ActNode I SceneNode I SceneNode II SceneNode III ActNode II SceneNode I AssignmentNode LvalNode Ophelia ConstantNode -4 OutputNode Ophelia SceneNode II SceneNode III
Arhiva pe care o veţi urca pe Vmchecker va trebui să conţină în directorul rădăcină:
README
în care să explicaţisrc
cu fişiere sursădoc
, generat de javadocInterpreter
, în fișierul Interpreter.java
, în pachetul sursă default al proiectului Eclipseparse()
în interiorul clasei Interpreter care va genera outputul dorit wordlists