Laboratorio di programmazione 2001-2002
Specifiche progetto Java

Implementare un interprete e una funzione di stampa per un linguaggio minimo dato.

See:
          Description

Packages
it.unibo.cs.labp.progetto2001.spec  

 

Implementare un interprete e una funzione di stampa per un linguaggio minimo dato.

Il linguaggio è imperativo e comprende le seguenti istruzioni ed espressioni.
Le istruzioni sono: while, if, assegnamento e blocco (sequenza di istruzioni).
Le espressioni sono: costanti booleane e intere, variabili, le operazioni di somma, sottrazione, moltiplicazione e divisione, le operazioni relazionali maggiore di, minore di, uguale ed infine le operazioni condizionali and, or, not.

Le operazioni aritmetiche e quelle relazionali sono definite solo sugli interi; le operazioni condizionali solo sui booleani.
Il Linguaggio non è tipato: le variabili non devono essere dichiarate e possono contenere indifferentemente un intero o un booleano.

I programmi si scrivono costruendo un albero di oggetti.
Ogni nodo rappresenta una entità del linguaggio (istruzione o espressione) e ha i figli che gli servono.
Ad esempio un nodo while avrà due figli uno contenente il sottoalbero che rappresenta l'espressione da valutare e l'altro contenente il sottoalbero che rappresenta le istruzioni da ripetere.

Sui nodi dell'albero si possono eseguire due funzioni polimorfe.
La funzione di stampa produce una rappresentazione testuale del programma simile ad un sorgente.
L'interprete esegue il programma; L'input/output del programma è rappresentato dal valore delle variabili.

La specifica del progetto comprende un package it.unibo.cs.labp.progetto2001.spec che definisce quattro interfacce.
Statement ed Expression che devono essere implementate rispettivamente dalle classi che rappresentano le istruzioni e da quelle che rappresentano le espressioni del linguaggio. Literal che rappresenta una espressione costante.
L'interfaccia LanguageFactory definisce i metodi per costruire le istruzioni e le espressioni.

Ogni gruppo di studenti deve scrivere un package it.unibo.cs.labp.progetto2001.nome_gruppo contentente tutte le classi per rappresentare le entità del linguaggio più una che si deve chiamare ALanguageFactory che deve implementare l'interfaccia LanguageFactory.

Per costruire gli oggetti necessari per scrivere un programma è sufficiente usare i metodi definiti nella vostra ALanguageFactory che provvede a restituire oggetti che rappresentano le entità del linguaggio nella vostra implementazione.

Esempio di programma fattoriale

Il codice Java che segue costruisce un albero che rappresenta la funzione fattoriale.
public class Test {
  public static void main(String[] args) {
    LanguageFactory lf = new ALanguageFactory();

    Expression n = lf.createVariable("n");
    Expression result = lf.createVariable("result");
    Statement fatt = lf.createBlock(new Statement[] {
		lf.createAssignment(n, lf.createLiteral(4)),
		lf.createAssignment(result, lf.createLiteral(1)),
	   	lf.createWhile(lf.createGreaterThan(n, lf.createLiteral(0)), lf.createBlock(new Statement[] {
      		lf.createAssignment(result, lf.createMultiplication(result, n)),
      		lf.createAssignment(n,lf.createSubtraction(n, lf.createLiteral(1)))
    	}))
    });

    fatt.prettyPrint(System.out);
    fatt.execute();
    System.out.println("n! = " + result);
  }
}
Sulla radice fatt dell'albero vengono eseguiti i due metodi prettyPrint(System.out) e execute() per ottenere una rappresentazione testuale del programma e per eseguirlo.
Il risultato del calcolo del fattoriale si trova nella variabile result e può essere stampato con una semplice println(result).
n = 4;
result = 1;
while(n > 0) {
result = result * n;
n = n - 1;
}
n! = 24

Template del progetto fornito

Per vostra comodità viene fornito un template del progetto che comprende la libreria con le interfacce da implementare (labp2001spec.jar), questa documentazione (index.html) e le directory che vi servono per scrivere i sorgenti.
docs
  api
    index.html
    ...
lib
  labp2001spec.jar
src
  it
    unibo
      cs
        labp
          progetto2001
            nome_gruppo
              Test.java
Dovete rinominare la cartella nome_gruppo seguendo la convenzione stabilita e inserire tutti i sorgenti delle vostre classi all'interno.

Per compilare (rispettivamente in windows o in linux):

javac -classpath lib\labp2001spec.jar;. -sourcepath src -d . src\it\unibo\cs\labp\progetto2001\nome_gruppo\Test.java

javac -classpath lib/labp2001spec.jar:. -sourcepath src -d . src/it/unibo/cs/labp/progetto2001/nome_gruppo/Test.java
Per eseguire (rispettivamente in windows o in linux):
java -cp lib\labp2001spec.jar;. it.unibo.cs.labp.progetto2001.nome_gruppo.Test

java -cp lib/labp2001spec.jar:. it.unibo.cs.labp.progetto2001.nome_gruppo.Test
Per produrre l'archivio jar da consegnare:
jar cf nome_gruppo.jar it src
Prima di spedire il file controllate con il seguente comando che sia completo di sorgenti e classi:
jar tf nome_gruppo.jar



Copyright © 2001 Riccardo Solmi. All Rights Reserved.