Attività progettuale in Linguaggi e Modelli Computazionali M

Slides:



Advertisements
Presentazioni simili
Introduzione al linguaggio C++
Advertisements

INFORMATICA Altre Istruzioni di I/O
LINGUAGGIO DI PROGRAMMAZIONE C
INFORMATICA Strutture condizionali
© 2007 SEI-Società Editrice Internazionale, Apogeo Unità F2 Selezione.
LE FUNZIONI IN C Sommario 1 Introduzione 2 Moduli di programma in C
PHP.
Sintassi (prima parte)
2/11/2004Laboratorio di Programmazione - Luca Tesei1 Punto della situazione Da dove veniamo, dove andiamo.
MATLAB.
MATLAB. Scopo della lezione Programmare in Matlab Funzioni Cicli Operatori relazionali Esercizi vari.
Dipartimento di Matematica
Generazione di Codice Intermedio
Algoritmi e Programmazione
Introduzione al linguaggio C
INFORMATICA Strutture iterative
Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – – SIENA.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
Process synchronization
Informatica di base A.A. 2003/2004 Algoritmi e programmi
Informatica 2. Concetti fondamentali di programmazione Programmare vuol dire scrivere un algoritmo in un linguaggio che faccia funzionare un calcolatore.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Introduzione a JAVA Anno Accademico 2009/2010.
MATLAB. …oggi… Programmare in Matlab Programmare in Matlab m-file m-file script script Funzioni Funzioni Cicli Cicli Operatori relazionali Operatori relazionali.
MATLAB.
MATLAB. …oggi… Programmare in Matlab Programmare in Matlab Funzioni Funzioni Cicli Cicli Operatori relazionali Operatori relazionali Indipendenza lineare,
MATLAB. …oggi… Programmare in Matlab Programmare in Matlab Funzioni Funzioni Cicli Cicli Operatori relazionali Operatori relazionali Esercizi vari Esercizi.
Algoritmi e Strutture Dati Valutazione del tempo di esecuzione degli algoritmi.
Fondamenti di Informatica I a.a Il linguaggio C Il controllo di flusso La selezione condizionale Listruzione switch I cicli Le istruzioni break,
Procedure e funzioni nei linguaggi di alto livello Lab Programmazione - turno /2006.
INFORMATICA Altre Istruzioni di I/O. © Piero Demichelis 2 Funzioni di I/O Per la lettura e la scrittura da videoterminale il C prevede numerose istruzioni.
Esercizi FUNZIONI Passaggio di parametri per valore, variabili e tipi locali e globali, prototipo.
Le funzioni.
Le funzioni a tempo di esecuzione
FUNZIONI: IL MODELLO APPLICATIVO 1) Valutazione, nellenvironment corrente, del simbolo che denota il nome della funzione; 2) Valutazione, nellenvironment.
FUNZIONI... Una funzione permette di dare un nome a una espressione rendendola parametrica float f(){ return * sin(0.75); } float f1(int x) { return.
Corso di PHP.
Programmazione in Java Claudia Raibulet
Javascript 6 Funzioni. Una funzione sarà eseguita in risposta ad un evento o ad una chiamata diretta. Le funzioni possono essere inserite comodamente.
Linguaggi di programmazione: funzioni Le funzioni richiedono un numero fisso o variabile di argomenti, ovvero valori che devono essere passati alla funzione.
ANTLR V.3 Renzi Alberto.
CODIFICA Da flow-chart a C++.
Il linguaggio C Le funzioni C Language Il passaggio dei parametri
Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due tipi: Cicli iterativi Cicli while.
Programmazione di Calcolatori
Parte 4 Elementi di Informatica di base
Lo sviluppo top down Le funzioni
Laboratorio di Informatica1 Parte 4 Laboratorio di Informatica Dott.ssa Elisa Tiezzi Dott.ssa Elisa Mori.
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
2000 Prentice Hall, Inc. All rights reserved. Attivazione di funzioni La chiamata/attivazione di funzione viene indicata citando il nome della funzione.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
Linguaggi e modelli computazionali LS Manni Tiziano
Anno accademico Le istruzioni di controllo in C.
GLI ARRAY MONODIMENSIONALI. Utilizzando le nostre attuali conoscenze, proviamo a risolvere il seguente problema: Calcolare la media dei voti conseguiti.
JavaScript Generalità Cos'è JavaScript?
Sintassi: Programma e classi Program::=prog {ClassDeclList {StatList}} ClassDeclList::=ClassDecl ClassDeclList |  ClassDecl::=class Ide c [StaticMetDefList]
Corso JAVA Lezione n° 03 Istituto Statale di Istruzione Superiore “F. Enriques”
Introduzione a Javascript
Corso di Algoritmi e Strutture Dati APPUNTI SUL LINGUAGGIO C
Capitolo 6 Iterazione Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies.
Strutture di controllo Esercizi!. Utilizzare i metodi: I modi per poter richiamare un metodo, di una classe (ad esempio SavitchIn) sono due. 1) E’ sempre.
Informatica B Allievi Elettrici - AA Fondamenti della programmazione in linguaggio C (II) Istruzioni e strutture di controllo.
1 Fabio Scotti – Università degli Studi di Milano Fabio Scotti ( ) Laboratorio di programmazione per la sicurezza Valentina Ciriani ( )
13 ottobre Decisioni F. Bombi 13 ottobre 2002.
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
Ancora sulla shell. Shell e comandi La shell e' un programma che interpreta i comandi dell'utente. I comandi possono essere dati da terminale, oppure.
Linguaggio C: Le basi Stefano Cagnoni e Monica Mordonini
Esercizi.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Algoritmi e basi del C Marco D. Santambrogio – Ver. aggiornata al 24 Agosto 2015.
Parsing ricorsivo discendente Il parsing ricorsivo discendente (recursive descent parsing) è un metodo di tipo top-down che può essere facilmente codificato.
Basi di Java Strutture base di Java. Basi di java ▪Variabili ▪Operatori ▪Condizioni e Cicli ▪Array.
Transcript della presentazione:

Attività progettuale in Linguaggi e Modelli Computazionali M My Small Language Realizzato da: Filippo Malaguti

Obiettivi del progetto Questo progetto ha come scopo la realizzazione di un semplice linguaggio di programmazione, che presenti tutti gli elementi più basilari. In particolare, il linguaggio ha le seguenti funzionalità: - dichiarazione ed uso di variabili reali o array di numeri reali - definizione di funzioni - operatori aritmetici, logici e condizionali - costrutti if-else e cicli while e for - stampa a video di stringhe e risultati di espressioni

Un esempio Il calcolo del fattoriale Le variabili devono essere dichiarate in modo esplicito ed associate ad un tipo (real o array). Lo scope è sempre locale all'ambiente di definizione. L'esecuzione inizia sempre dalla funzione main. Tutte le funzioni, eccetto il main, devono ritornare un valore. real x = 4; function main(){ real f = fact($x); println($x, "! = ", $f); } function fact(n){ if($n == 0 || $n == 1){ return 1; return $n*fact($n-1); I costrutti come if, while, for, devono essere seguiti da un insieme di istruzioni racchiuse tra parentesi graffe. Nelle espressioni condizionali si considera TRUE un valore maggiore di zero. Ogni volta che, all'interno di una espressione, si vuole accedere al valore contenuto in una variabile, bisogna usare la forma $id_variabile.

Funzioni: chiusura lessicale e call-by-value Nel programma è sempre presente un ambiente globale, inoltre ogni funzione ha un proprio ambiente locale. Ogni volta che in una funzione si tenta di accedere ad una variabile non definita al suo interno, si cerca nell'ambiente globale. Per il passaggio dei parametri viene adottato il modello Call-by-value: ogni espressione passata come parametro viene valutata, poi il valore calcolato viene assegnato ad una variabile nell'environment della funzione chiamata.

Uso degli array In questo linguaggio gli array sono un particolare tipo e possono contenere solo valori reali. Non hanno una dimensione prefissata. array a = [1,2.5,3.6,4]; In fase di dichiarazione si può usare una notazione di assegnamento compatta. Altrimenti si deve assegnare un valore per volta. a[0] = 1; a[1] = 2.5; … a[n] = r; Per accedere al valore di un elemento si procede come per le variabili reali, ma si deve specificare l'indice al quale accedere tramite una espressione. real avg = ($a[0] + $a[1]) / 2;

La Grammatica Per realizzare il parser della grammatica è stato utilizzato il parser generator ANTLR. La grammatica risultante è di tipo context-free: a causa di alcune ambiguità la grammatica non poteva essere sempre LL(1), quindi in generale è LL(2). Per ragioni di efficienza, però, solo dove necessario è stato indicato un valore di lookahead pari a 2. N.B. Nelle prossime slide si è omessa la sintassi per la generazione dell'albero.

Grammatica del linguaggio Lo scopo della grammatica è il simbolo non terminale prog: prog ::= (var_decl ';')* function_def*; Un programma può cominciare con la dichiarazione di alcune variabli globali seguita dalla definizione di una serie di funzioni.

Dichiarare le variabili Ogni variabile ha un tipo e un identificativo. Volendo può essere subito inizializzata con il risultato di una espressione. var_decl: type ID ('=' (expr | ('[' (expr (','expr)*) ']')))?; type: 'real' | 'array'; Esempi: real r; real r = 1; array a = [1,2,3,4];

Definire le funzioni Ogni funzione ha un nome, zero o più parametri formali e un blocco di istruzioni. function_def: 'function' ID '(' (ID (',' ID)*)? ')' block; Esempio: function main(){ } function avg(n1, n2){ return (n1 + n2)/2;

Le istruzioni - 1 Sono tutte istruzioni: le dichiarazioni di variabili, il costrutto if-else, i cicli, alcuni comandi speciali (continue, break e return) e il block. stat: ((expr|print|return_stat|'continue'|'break'| var_decl)';') | if_else | repeat | block | for_stat | while_stat; Un block è un insieme di istruzioni racchiuso tra '{''}' e costituisce il corpo delle funzioni. block: '{' stat* '}';

Le istruzioni - 2 if_else: 'if' '(' expr ')' block ('elseif' '(' expr ')' block)* ('else' block)?; for_stat: 'for' '(' expr ';' expr ';' expr ')' block; while_stat: 'while' '(' expr ')' block; repeat: 'repeat' '(' expr ')' block; print:('print'|'println') '(' (expr|STRING)(',' (expr|STRING))* ')'; Sia i cicli, sia il blocco if-else, devono essere seguiti da un block, in questo modo si evita il problema del dangling else.

Le Espressioni - 1 Le espressioni ritornano sempre un valore reale. Per discriminare tra un assegnamento e una chiamata di funzione è necessario un lookhaead pari a 2. expr options {k=2;}: logic_expr | assign; Per come è definita la grammatica, questa è la priorità degli operatori: -, ! (meno unario e not); *, / (moltiplicazione e divisione) +, - (somma e sottrazione) <=, <, ==, !=, >, >= (operatori condizionali) &&, || (And ed Or logici) = (assegnamento)

Le Espressioni - 2 logic_expr: cond_expr (('&&'|'||') cond_expr)*; cond_expr: math_expr (('<'|'<='|'=='|'!='|'>='|'>') math_expr)*; math_expr: term (('+'|'-') term)*; term: unary_expr (('*'|'/') unary_expr)*; unary_expr: ('-'|'!')? atom;

Le Espressioni - 3 atom: NUM | '$' var_id | '(' expr ')' | function; Un atomo può essere un valore numerico, una espressione tra parentesi, una chiamata di funzione o un identificativo di variabile; in questo caso serve il simbolo $ per indicare che si intende accedre al suo valore. assign options{k=2;}: (ID '=' expr) | (array_elem '=' expr); Lookahead 2 per poter distinguere i due casi: -assegnamento di una variabile -assegnamento di un elemento di un array

Accesso a variabili e chiamata di funzioni var_id options{k=2;}: ID | array_elem; Anche in questo caso il lookahead 2 serve per distinguere tra variabile semplice o array. array_elem: ID '[' expr ']'; function: ID '(' (expr (',' expr)*)? ')'; Quando si chiama una funzione si possono passare dei parametri, che però possono essere solo espressioni: non è possibili passare un array.

Numeri ed identificatori NUM : INT | FLOAT; ID: (LETTER|'_') (LETTER | DIGIT | '_')*; STRING: '"'.*'"'; fragment NON_ZERO_DIGIT : '1'..'9'; fragment DIGIT : '0'|NON_ZERO_DIGIT; fragment LETTER: LOWER | UPPER; fragment LOWER: 'a'..'z'; fragment UPPER: 'A'..'Z'; fragment INT : '0'|NON_ZERO_DIGIT DIGIT*; fragment FLOAT : INT'.'DIGIT+; WS: ( ' ' | '\r''\n' | '\n' | '\t' )+ { $channel = HIDDEN; };

Abstract Parsing Tree Il parser fornisce in uscita un APT adatto ad un approccio a visitor. Ogni nodo dell'albero discende dalla classe astratta MyLangNode, a sua volta sottoclasse della classe di antlr CommonTree.

Abstract Parsing Tree – Le classi IdNode MyLangNode StringNode FunctionDefNode TypeNode IfElseStatNode ProgNode VarDeclNdoe StatNode IdExpNode ArrayVarDeclNdoe NumNode ExpStatNode ForStatNode ArrayElemNode BinOpNode UnaryOpNode

Esempio di APT Il parsing del codice sopra produce real x; function main(){ x = 10 / 2; } ProgNode VarDeclNode FunctionDefNode BlockStatNode Il parsing del codice sopra produce l'albero astratto mostrato affianco. La radice è il nodo di tipo ProgNode, che ha come figli tutto ciò che è definito in ambiente globale. Una funzione ha come figli le proprie istruzioni ed eventuali parametri VarAssignNode IdNode DivNode NumNode NumNode

Visitor L'albero astratto che si ottiene in seguito al parsing è adatto ad essere esplorato tramite il pattern Visitor. In questo progetto sono stati realizzati due differenti visitor con la medesima interfaccia: - TreeBuilderVisitor: consente di visualizzare in un componente JTree la struttura stessa dell'APT - EvalVisitor: è il vero interprete del linguaggio che si occupa di valutare i singoli nodi dell'APT eseguendo così il programma.

L'Architettura dell'interprete - 1

L'Architettura dell'interprete - 2 Il sistema di interazione con l'utente è basato su due semplici classi: - una Form per l'interfaccia grafica; - una classe interprete che invoca il parser e i visitor.

L'interfaccia grafica Editor di testo Visualizzatore Albero Output

Programmi di Test Per testare il linguaggio e l'interprete sono stati messi in esecuzione alcuni programmi di prova, i più rilevanti sono: - Il classico HelloWorld - Un programma di calcolo del fattoriale tramite funzione ricorsiva - Un programma di calcolo della media dei valori contenuti in un array

Conclusioni In conclusione il linguaggio di programmazione realizzato può essere correttamente riconosciuto e valutato dall'interprete. Si tratta, però, di un linguaggio ancora molto semplice, che manca in particolare di alcune cose: - la possibilità di fornire input a runtime - array multi-dimensionali - una maggiore gamma di tipi di variabile (caratteri, stringhe, ecc..)