La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Calendar Generator Progetto Linguaggi e Modelli Computazionali LS Docente: Enrico Dentidi: Alberto Renzi.

Presentazioni simili


Presentazione sul tema: "Calendar Generator Progetto Linguaggi e Modelli Computazionali LS Docente: Enrico Dentidi: Alberto Renzi."— Transcript della presentazione:

1 Calendar Generator Progetto Linguaggi e Modelli Computazionali LS Docente: Enrico Dentidi: Alberto Renzi

2 Obbiettivo del progetto Realizzare un interprete in grado di creare calendari personalizzati pronti per la stampa, utilizzando un linguaggio semplice e di facile utilizzo anche per utenti senza nozioni di programmazione. L’utente deve avere la possibilà di personalizzare: la grandezza del calendario, in termini di pixel; l’anno di riferimento; i mesi, con le relative immagini di background; la cartella di output da utilizzare; i promemoria testuali per festività, compleanni e appuntamenti.

3 Analisi del problema L’interprete dovrà quindi accettare una stringa di caratteri scritta dall’utente nell’interfaccia grafica; eseguirne l’analisi lessicale e sintattica producendo in output eventuali errori presenti nella frase passata; eseguire l’analisi semantica della frase producendo in output o un messaggio di errore con informazione sul tipo di errore commesso, oppure la generazione dei file del calendario nella cartella indicata.

4 Esempio di file.cal (1/2) PAGESETUP :{ WIDTH=2000; HEIGHT=3000; }; SETTINGS : { STARTMONTH: GENNAIO; ENDMONTH: DICEMBRE; YEAR=2010; OUTPUT=C:\Users\alberto\Desktop\out\; GENNAIO: { IMAGE = C:\Users\alberto\Desktop\mesi\gennaio.JPG; TYPE = HALF; }; FEBBRAIO: { IMAGE = C:\Users\alberto\Desktop\mesi\febbraio.JPG; TYPE = FULL; }; };

5 Esempio di file.cal (2/2) DAYS : {BIRTHDAY: { 25/MAGGIO-Alessandra; 15/OTTOBRE-Elisa; 13/SETTEMBRE-Franca; 31/GENNAIO-Antonio; }; HOLIDAY: { 1/GENNAIO-Capodanno; 6/GENNAIO-Epifania; 8/MARZO-Festa donna; 13/APRILE-Lunedì angelo; 12/APRILE-Pasqua; 25/APRILE-F.Libertà; 1/MAGGIO-F. lavoro; 2/GIUGNO-F. Repubblica; 15/AGOSTO-Ferragosto; 2/NOVEMBRE-Com.defunti; 25/DICEMBRE-Natale; 26/DICEMBRE-S. Stefano; 26/DICEMBRE-S. Silvestro; }; APPOINTMENT: { 1/DICEMBRE-Bollo Auto; };

6 Lexer: Token (1/2) COMMENT: '//'(~('\r'|'\n'))+ {skip();}; WS : ( ' ' | '\t' | '\r' | '\n' )+ {skip();} ; PAGESETUP :'PAGESETUP'; IMAGE:'IMAGE'; STARTMONTH :'STARTMONTH'; ENDMONTH:'ENDMONTH'; YEAR:'YEAR'; HALF:'HALF'; FULL:'FULL'; SETTINGS:'SETTINGS'; TYPE:'TYPE'; DAYS :'DAYS'; PARGL:'{'; PARGR:'}';

7 Lexer: Token (2/2) MONTH:('GENNAIO' | 'FEBBRAIO'| 'MARZO'| 'APRILE'| 'MAGGIO'| 'GIUGNO'| 'LUGLIO'| 'AGOSTO'| 'SETTEMBRE'| 'OTTOBRE'| 'NOVEMBRE'| 'DICEMBRE') ; HOLIDAY :'HOLIDAY:'; BIRTHDAY :'BIRTHDAY:'; APPOINTMENT:'APPOINTMENT:'; SETMONTH:'SETMONTH'; WIDTH:'WIDTH'; HEIGHT:'HEIGHT'; GIORNO : ‘1'..'9'|('1'|'2')'0'..'9'|'30'|'31'; QCIFRE:'1'..'9''0'..'9''0'..'9''0'..'9'; SLASH :'/'; SEMICOLON:';'; DUEP :':'; OUTPUT:'OUTPUT'; PATH : ('A'..'Z' | 'a'..'z')':' ('\\' ('a'..'z' | 'A'..'Z' | '0'..'9' | '.' | '_' | ' ')*)* ; TEXT_WITH_SPACES : '-'(~(';'|'\r'|'\n'))+;

8 Grammatica in EBNF ::= [ ] ::= pagesetup duep pargl pargr semicolon ::= width duep qcifre semicolon ::= height duep qcifre semicolon ::= settings duep pargl + pargr semicolon ::=startmonth duep month semicolon endmonth duep month semicolon ::= year duep qcifre semicolon ::= output duep path semicolon ::=month duep pargl image duep path semicolon [ ] pargr semicolon ::= days pargl ( | | )* pargr ::= birthday duep pargl ( text_with_spaces semicolon)* pargr semicolon ::= holiday duep pargl ( text_with_spaces semicolon)* pargr semicolon ::= appointment duep pargl ( text_with_spaces semicolon)* pargr semicolon ::= giorno slash month ::=type duep (half|full) semicolon

9 Tipo grammatica e linguaggio Tipo grammatica: è di tipo 2 in quanto non ha produzioni regolari e le produzioni sono tutte nella forma A  a con a є (VT U VN)*, A є VN LL(1): Nessuna produzione produce ε-rules e i simboli non terminali che compaiono alla sinistra di più produzioni alternative hanno starter symbol corrispondenti alle parti destre delle produzioni alternative disgiunti, quindi la grammatica è LL(1). Tipo linguaggio generato: la grammatica non presenta self- embedding e genera quindi un linguaggio tipo 3. E’ possibilie utilizzare l’analisi ricorsiva discendente (top-down)

10 Strumenti Linguaggio: java IDE: Netbeans ANTLR v.3: come strumento automatico per la generazione di lexer parser e treeparser. ImageJ: Librerie open source, sviluppate in java. Nel progetto sono state sfruttate le api per la creazione e la modifica di immagini. Data la possibilità di scrivere plugin in Java e’ stato possibile creare un plugin in grado di aprire l’interprete affinchè l’utente possa modificare direttamente le immagini prodotte per aggiungere ulteriori dettagli.

11 Antlr Strumento per la generazione di parser LL(k). Permette di generare separatamente lexer, parser e TreeParser (parser che riconosce un albero). Accetta grammatiche in EBNF e la generazione di alberi. Da inoltre la possibilità di aggiungere azioni semantiche direttamente nella grammatica. Mette a disposizione un debugger interno per visualizzare passo passo della derivazione di una frase di input e permette di visualizzare l’albero di derivazione e l’AST.

12 Architettura: interprete Il sistema è composto da quattro classi principali: CalendarLexer : crea i token per il parser; CalendarParser: responsabile del controllo sintattico e della costruzione dell’APT; CalendarTree (treeparser): a partire dall’APT (CommonTree) generato dal parser sono state associate azioni semantiche a ciascun nodo dell’albero in modo da “configurare” un oggetto thread di tipo “Engine”. Al termine della visita dell’albero viene eseguito un check sulla coerenza dei dati inseriti e se positivo fa partire il thread che genererà il calendario; Engine : Thread contenente tutte le strutture dati necessarie per la creazione del calendario, viene inizializzato da CalendarTree durante la visita dell’albero e viene fatto partire per produrre in output i file del calendario.

13 Architettura: interfaccie Sono state create due interfaccie grafiche per la creazione del calendario: CalendarEditor : permette di modificare manualmente il codice che verrà passato all’interprete. CalendarGUI : permette la creazione del calendario anche per i meno esperti. Nel caso l’interfaccia venisse richiamata dall’editor, l’inizializzazione è comunque affidata all’interprete, che in questo caso, non produrrà in output le immagini ma effettuerà solo il caricamento nell’interfaccia. Per eseguire questa operazione è necessario però che la frase passata superi analisi lessicale e sintattica.

14 Sintesi funzionamento CalendarEditor CalendarGUI CalendarLexer CalendarParser CalendarTree Engine CommonTokenStream CommonTreeNodeStream CommonTree Token Output phrase configura consistentCheck run

15 CalendarEditor

16 CalendarGUI...

17 Output generato...

18 Collaudo Sono state introdotti test Junit con la finalità di testare: Lexer Accettazione dei token previsti; Non accettazione di sequenze di caratteri errati, simulando errori di scrittura da parte dell’utente. Parser Riconoscimento di un token mancante o non previsto Giusta accettazione di una frase corretta. Treeparser Verifica del corretto caricamento dei dati nell’engine; Verifica del funzionamento del check di coerenza dei dati: Mese di partenza precedente al mese di arrivo; La specifica delle immagini di background per i mesi richiesti in output.

19 Ulteriori Features... Features di ANTLR disabilitate: ERROR RECOVERY: E’ il processo di recovery da un errore di sintassi che avviene alterando l’input stream o consumando simboli fino a che il parser può ripartire in uno stato conosciuto. Il parser infatti in corrispondenza di token mancanti o errati provvedeva all’autoinserimento o all’auto consumo di token per poi proccedere con la valutazione dei restanti token. Ridefinendo i metodi di gestione degli errori questa funzionalità, sebbene molto interessante, è stata disattivata al fine di verificare il corretto comportamento dell’interprete generato dalla grammatica. MECCANISMO DI NOTIFICA DI ERRORI: Al posto di redirigere solamente l’output nella casella di testo, è stato creato un meccanismo di notifica personalizzato al fine di indicare all’utente non solo la posizione dell’errore e il token errato o previsto, ma anche un esempio di codice accettato dando all’utente la possibilità di confrontarlo con il codice da lui scritto.

20 Sviluppi futuri Grammatica: Introduzione di regole grammaticali per permettere all’utente di personalizzare la grandezza, il colore e la posizione di ogni elemento del calendario. La possibilità inoltre di poter indicare più immagini come background del calendario e la posizione dell’immagine all’interno del foglio. Funzionalità dell’editor: Highlight del codice. Funzionalità della GUI: Generazione di un anteprima.


Scaricare ppt "Calendar Generator Progetto Linguaggi e Modelli Computazionali LS Docente: Enrico Dentidi: Alberto Renzi."

Presentazioni simili


Annunci Google