Administrativ
Laboratoare
Tema
Teste
Resurse utile
Alte resurse
Arhiva Teme
Administrativ
Laboratoare
Tema
Teste
Resurse utile
Alte resurse
Arhiva Teme
Fiind mari fani a filmelor cu Arnold Schwarzenegger, studentii de la Calculatoare s-au gandit ca ar fi amuzant sa programeze intr-un limbaj bazat integral pe replicile lui Arnold din diferite filme, astfel ca s-au apucat de ArnoldC (ArnoldC). 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 le plac provocarile și mai ales POO, studenții au decis să își scrie propriul interpretor de ArnoldC în Java. \m/
Va trebui să creați un arbore sintactic (AST) pornind de la structura limbajului ArnoldC.
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)
Este un limbaj de programare cu o structură fixă, avand constructii specifice pentru declararea si folosirea datelor, menit sa fie amuzant. In varianta restrânsă pe care o implementăm în temă, acesta va avea doar instrucțiuni aritmetice, if-uri, while-uri si instructiuni de afișare la consolă. Nu există structuri de date sau clase. Limbajul ArnoldC 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 ArnoldC distingem urmatoarele constructii:
Tema nu contine schelet de cod. Fiecare student este responsabil de cum va retine si interpreta lista de cuvinte cheie.
Fiecare program scris in ArnoldC trebuie sa inceapa cu instructiunea BeginMain si sa se termine cu EndMain. Exemplu:
IT'S SHOWTIME [ ... ] YOU HAVE BEEN TERMINATED
Exemplu “Hello World”:
IT'S SHOWTIME TALK TO THE HAND "hello world" YOU HAVE BEEN TERMINATED
... HEY CHRISTMAS TREE first YOU SET US UP @I LIED HEY CHRISTMAS TREE second YOU SET US UP @NO PROBLEMO ...
... GET TO THE CHOPPER a HERE IS MY INVITATION 4 ENOUGH TALK ...
GET TO THE CHOPPER myVar HERE IS MY INVITATION myVar GET UP myVar YOU'RE FIRED 5 ENOUGH TALK
GET TO THE CHOPPER d HERE IS MY INVITATION a CONSIDER THAT A DIVORCE b CONSIDER THAT A DIVORCE c ENOUGH TALK
BECAUSE I'M GOING TO SAY PLEASE d TALK TO THE HAND "(a || b || c) is true" BULLSHIT TALK TO THE HAND "(a || b || c) is not true" YOU HAVE NO RESPECT FOR LOGIC
If (d) { Print ("(a || b || c) is true"); Else Print ("(a || b || c) is not true"); }
Exemplu de program care printeaza numerele de la 1 la 10.
IT'S SHOWTIME HEY CHRISTMAS TREE isLessThan10 YOU SET US UP @NO PROBLEMO HEY CHRISTMAS TREE n YOU SET US UP 0 STICK AROUND isLessThan10 GET TO THE CHOPPER n HERE IS MY INVITATION n GET UP 1 ENOUGH TALK TALK TO THE HAND n GET TO THE CHOPPER isLessThan10 HERE IS MY INVITATION 10 LET OFF SOME STEAM BENNET n ENOUGH TALK CHILL YOU HAVE BEEN TERMINATED
Pornind de la specificațiile de mai sus, va trebui să construiți un arbore sintactic pentru un program ArnoldC. Fiecare tip de operație va fi reprezentată de un tip de nod specific în arborele sintactic. Să luăm un exemplu simplu, pentru următorul program:
IT'S SHOWTIME HEY CHRISTMAS TREE a YOU SET US UP @NO PROBLEMO HEY CHRISTMAS TREE b YOU SET US UP @I LIED GET TO THE CHOPPER a HERE IS MY INVITATION a CONSIDER THAT A DIVORCE b ENOUGH TALK BECAUSE I'M GOING TO SAY PLEASE a TALK TO THE HAND "(a || b) is true" BULLSHIT TALK TO THE HAND "(a || b) is not true" YOU HAVE NO RESPECT FOR LOGIC YOU HAVE BEEN TERMINATED
Structură arbore:
Programele ArnoldC vor fi citite din folderul tests
. In folderul tests
se vor afla fisierele de test (test1.ac
,test2.ac
, etc). Parser-ul va primicalea 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 variable_name ConstantNode integer_value SAU RvalNode variable_name SAU nod_operatii_aritmetice
PrintNode ConstantNode <integer_value> SAU VariableNode <variable> SAU StringNode <string>
SumNode DifferenceNode ConstantNode <4> ConstantNode <5> ConstantNode -3
Avand urmatorul exemplu:
IT'S SHOWTIME HEY CHRISTMAS TREE a YOU SET US UP @NO PROBLEMO HEY CHRISTMAS TREE b YOU SET US UP @I LIED HEY CHRISTMAS TREE c YOU SET US UP @I LIED HEY CHRISTMAS TREE d YOU SET US UP @I LIED GET TO THE CHOPPER d HERE IS MY INVITATION a CONSIDER THAT A DIVORCE b CONSIDER THAT A DIVORCE c ENOUGH TALK BECAUSE I'M GOING TO SAY PLEASE d TALK TO THE HAND "(a || b || c) is true" BULLSHIT TALK TO THE HAND "(a || b || c) is not true" YOU HAVE NO RESPECT FOR LOGIC YOU HAVE BEEN TERMINATED
Fisierele de iesire pentru exemplul anterior sunt urmatoarele:
(a || b || c) is true
MainNode DeclareNode LvalNode <a> ConstantNode <1> DeclareNode LvalNode <b> ConstantNode <0> DeclareNode LvalNode <c> ConstantNode <0> DeclareNode LvalNode <d> ConstantNode <0> AssignmentNode LvalNode <d> OrNode OrNode RvalNode <a> RvalNode <b> RvalNode <c> IfNode ConditionNode <d> IfBodyNode PrintNode StringNode <(a || b || c) is true> ElseBodyNode PrintNode StringNode <(a || b || c) is not true>
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ăMakefile
care va contine cel putin regulile: