= Tema 3 - ArnoldC Interpreter =

* Responsabil: Alexandru Caciulescu Razvan Chitu * Deadline: 13.12.2016 * Data publicării: 29.11.2016 * Data ultimei modificări: 29.11.2016 * Data tester-ului: STANDBY

Obiective

* Construirea unui AST (Abstract Syntax Tree) * Aprofundarea noțiunilor despre design patterns, respectiv Visitor. * Respectarea unui coding-style adecvat.

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) * 90p teste publice * 10p README, comentarii, JavaDoc, coding style

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:

  • False I LIED
  • True NO PROBLEMO
  • If BECAUSE I'M GOING TO SAY PLEASE
  • Else BULLSHIT
  • EndIf YOU HAVE NO RESPECT FOR LOGIC
  • While STICK AROUND
  • EndWhile CHILL
  • PlusOperator GET UP
  • MinusOperator GET DOWN
  • MultiplicationOperator YOU'RE FIRED
  • DivisionOperator HE HAD TO SPLIT
  • ModuloOperator I LET HIM GO
  • EqualTo YOU ARE NOT YOU YOU ARE ME
  • GreaterThan LET OFF SOME STEAM BENNET
  • Or CONSIDER THAT A DIVORCE
  • And KNOCK KNOCK
  • DeclareInt HEY CHRISTMAS TREE
  • SetInitialValue YOU SET US UP
  • BeginMain IT'S SHOWTIME
  • EndMain YOU HAVE BEEN TERMINATED
  • Print TALK TO THE HAND
  • AssignVariable GET TO THE CHOPPER
  • SetValue HERE IS MY INVITATION
  • EndAssignVariable ENOUGH TALK

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: * MainNode: root node AST * Noduri: assignments, prints, operații, if, while * Frunze: constante, variabile * liniile care nu au nici o valoare din punct de vedere al limbajului nu vor fi luate în considerare

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: * nodul din care pornește programul se va scrie ca “MainNode”. * if-urile se vor scrie in formatul “IfNode” și vor conține ConditionNode <variable> , IfBodyNode si ElseBodyNode (ramura de else este optionala). * while-urile se vor scrie in formatul “WhileNode” si vor conține ConditionNode <variable> si BodyNode. * Atat la if cat si la while nodurile de Body pot contine in interiorul lor orice alt tip de node in afara de MainNode. * atribuirile pot avea în partea stânga numai o variabilă (adică o variabula), dar în partea dreaptă pot avea fie o constantă, fie o variabilă. Formatul este acesta:

 AssignmentNode 
  	 LvalNode variable_name 
  	 ConstantNode integer_value
              SAU RvalNode variable_name
              SAU nod_operatii_aritmetice
  • instructiunile de output (”TALK TO THE HAND” etc):
PrintNode
	ConstantNode <integer_value>
	SAU VariableNode <variable>
	SAU StringNode <string>

* instructiuni aritmetice:

 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ă:

  • README în care să explicaţi
    • cum aţi construit arborele sintactic
    • cum aţi aplicat pattern-ul visitor asupra arborelui
  • alte detalii relevante pentru implementare
  • directorul src cu fişiere sursă
  • Makefile care va contine cel putin regulile:
    • build
    • run
    • doc
    • clean
Resurse
Referințe
poo-ca-cd/arhiva/teme/2016/tema3.txt · Last modified: 2020/07/28 23:08 (external edit)
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