Sei sulla pagina 1di 2

Laboratorio di Linguaggi di Sistema a.a.

2010/2011 Progetto finale II (base)


Il problema Si vuole realizzare un interprete per un linguaggio simile al BASIC (semplificato). In questo linguaggio, ogni riga di testo numerata e pu contenere una singola istruzione del linguaggio; non sono previste dichiarazioni, e non esistono i blocchi. Il linguaggio (che chiameremo BALLSIC) meglio descritto sotto. L'interprete verr eseguito con la sintassi
ballsic programma

in cui programma il nome di un file di testo contenente il programma da eseguire. L'interprete inizier l'esecuzione dalla riga di numero pi basso, e continuer fino a terminazione seguendo le regole del linguaggio. Se invocato con l'opzione -d, l'interprete stampa su stderr una traccia dell'esecuzione del programma (indicando ogni istruzione eseguita e il valore calcolato dei suoi eventuali argomenti). Il linguaggio BALLSIC Ogni riga non-vuota del programma ha il formato num istr in cui il num un intero (fra 1 e 65536) che rappresenta il numero di riga, mentre istr una singola istruzione del linguaggio. Non necessario che le righe di un file contenente un programma BALLSIC abbiano numeri crescenti, n che i numeri di riga siano consecutivi (anzi, pratica comune numerare le righe con passo 10, in modo da poter poi inserire ulteriori istruzioni senza dover rinumerare l'intero programma); l'interprete deve ordinare se necessario le righe di programma in modo che, logicamente, il programma sia formato da righe ordinate secondo l'ordinamento numerico. Le istruzioni da implementare sono le seguenti: var = expr calcola il valore dell'expr e lo assegna alla var GOTO expr calcola il valore dell'expr e continua l'esecuzione alla prima riga con numero successivo al valore calcolato IF expr THEN istr valuta l'expr; se il valore diverso da 0 e dalla stringa nulla, esegue l'istr PRINT expr calcola il valore di expr e lo stampa su stdout INPUT var legge un valore da stdin e lo assegna a var; se il valore letto un numero decimale, viene assegnato il suo valore numerico; altrimenti, viene assegnata l'esatta stringa inserita STOP termina l'esecuzione REM testo commento; sia l'istruzione che il testo vengono ignorati Le variabili sono denotate da un identificatore composto da un solo carattere alfabetico (a-z) e non necessitano di dichiarazione. Esse possono avere come valore un numero intero, oppure una stringa. Il linguaggio non differenzia maiuscole e minuscole (salvo che dentro le stringhe), sia per le istruzioni che per gli identificatori. Le espressioni sono costruite come segue: costanti letterali numeriche, denotate da numeri decimali come di consueto; costanti stringa, denotate da sequenze di caratteri delimitate da doppie virgolette; non sono previste sequenze di escape (quindi, per esempio, una costante stringa letterale BALLSIC non pu contenere a-capo o virgolette); identificatori, ovvero i nomi di variabili come gi descritti sopra; operatori aritmetici: +, *, -, / implementati come di consueto (* e / hanno priorit su + e -); operatori stringa: + indica la concatenazione di stringhe; se uno dei due operandi un valore intero, esso viene promosso e convertito in una rappresentazione decimale come stringa del suo valore; operatori relazionali: =, >, <, <>, >=, <= che operano su numeri secondo il loro ordine numerico, e su stringhe secondo l'ordine lessicografico; il risultato di un confronto 0 o la strings vuota (che indica FALSE) o diverso da 0 o stringa vuota (che indica TRUE); parentesi: ( e ) alterano l'ordine di valutazione con le regole consuete (si valutano prima le parentesi pi interne, a parit di livello quelle pi a sinistra).

Esempio Ecco un esempio di programma BALLSIC (come potrebbe essere scritto su file; si ricordi che ai fini dell'esecuzione le istruzioni sono considerate in ordine di numero):
5 REM Pari o Dispari? 10 20 30 40 50 60 70 11 12 15 17 INPUT n IF n<2 THEN GOTO 50 n=n/2 GOTO 20 IF n=0 THEN PRINT n + pari IF n=1 THEN PRINT n + dispari STOP REM Controllo che n sia positivo IF n>=0 GOTO 20 PRINT Errore! Inserisci un numero positivo GOTO 10

Trattamento degli errori e terminazione L'interprete BALLSIC termina se si verificano errori durante il caricamento del programma, nel qual caso deve essere emesso un errore su stderr che descrive il problema, e arresta la computazione se si verificano errori durante l'esecuzione (per esempio: una divisione per 0); in questo secondo caso, il messaggio di errore deve contenere anche l'indicazione della riga di programma responsabile. Il programma termina regolarmente (come se si fosse incontrato uno STOP) se si esaurisce la lista delle istruzioni (per esempio, nel caso di un GOTO a un numero di riga pi alto del massimo numero di riga del programma). Modalit di consegna Lelaborato deve essere consegnato improrogabilmente entro il 20 Luglio 2011 alle ore 17:00, e deve essere costituito da una stampa del codice sorgente, adeguatamente formattato e commentato, da una stampa con esempi di esecuzione, e da una breve relazione scritta (3-5 pagine) che descrive il progetto stesso. La versione a stampa pu essere consegnata direttamente al docente, oppure depositata presso il centralino del Dipartimento di Informatica. Tutto il materiale deve essere anche inviato via email al docente ( gervasi@di.unipi.it), in forma elettronica, entro il termine indicato.