Table of Contents

Tema 3 - ArnoldC Interpreter

Obiective

Introducere

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/

Cerințe

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.

Dacă temă nu respectă această cerintă nu va primi punctajul testelor.

Punctaj (100p)

Descriere

ArnoldC

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.

Structura limbajului ArnoldC

Begin/End Main

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

Print

Exemplu “Hello World”:

IT'S SHOWTIME
TALK TO THE HAND "hello world"
YOU HAVE BEEN TERMINATED

Declarare Variabila

...
HEY CHRISTMAS TREE first
YOU SET US UP @I LIED

HEY CHRISTMAS TREE second
YOU SET US UP @NO PROBLEMO
...
In exemplul de mai sus am declarat doua variabile, first si second, ca 0, respectiv 1. A se observa ca pe langa cuvintele cheie, atunci cand lucram cu “true” si “false” acestea trebuiesc prefixate cu @ deoarece sunt macro-uri.

Setare Variabila

...
GET TO THE CHOPPER a
HERE IS MY INVITATION 4
ENOUGH TALK
...
Dupa declararea initiala a unei variabile, aceasta poate fi modificata ca in exemplul anterior. Codul este echivalent cu “a = 4”.

Operatii matematice

GET TO THE CHOPPER myVar
HERE IS MY INVITATION myVar
GET UP myVar
YOU'RE FIRED 5
ENOUGH TALK
myVar = (myVar + myVar) * 5

Operatii logice

GET TO THE CHOPPER d
HERE IS MY INVITATION a
CONSIDER THAT A DIVORCE b
CONSIDER THAT A DIVORCE c
ENOUGH TALK
d = ((a || b) || c)

If-Else

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");
}
A se observa ca in ArnoldC neavand True si False, instructiunile de if verifica doar ca variabila respectiva (in acest caz “d”) sa fie diferita de 0.

While

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

Implementare

Arborele sintactic

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

Se va genera un AST de forma:

Structură arbore:

Nu există nici o restricție legată de modul cum numiți și implementați clasele reprezentând nodurile arborelui, atâta timp cât structura logică a arborelui este cea descrisă în cerința și modul de afișare al arborelui corespunde celui din fisirele output de referință.

Date de intrare. Date de ieșire.

Intrare

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.

Se garantează că nu vor exista greșeli în aceste fișiere. Nu este necesară tratarea eventualelor erori lexicale/sintactice/semantice, deoarece se garantează că nu există.

Ieșire

Interpretorul va trebui să creeze 2 fișiere in folderul output pentru fiecare test:

  1. Un fișier testx.out în care se va scrie rezultatul interpretării.
  2. Un fișier testx.ast în care se va scrie structura arborelui sintactic.

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 
Tema va trebui să indenteze nodurile cu TAB (“\t”). Astfel nodurile copii vor avea un nivel de indentare în plus față de părinți, adică vor avea un TAB în plus. Nodul root pentru program va porni de la nivelul de indentare 0.

Avand urmatorul exemplu:

example.ac
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:

example.out
(a || b || c) is true
example.ast
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>

Structura arhivei

Arhiva pe care o veţi urca pe Vmchecker va trebui să conţină în directorul rădăcină:

Resurse

arnoldc-tests.zip arnoldc-simple-tests.zip

Referințe