1 / 20

Calendar Generator

Calendar Generator. Progetto Linguaggi e Modelli Computazionali LS. di: Alberto Renzi. Docente: Enrico Denti. Obbiettivo del progetto.

trudy
Download Presentation

Calendar Generator

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Calendar Generator Progetto Linguaggi e Modelli Computazionali LS di: Alberto Renzi Docente: Enrico Denti

  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 • <Start>::= <pagesetup> <settings> [<daylist>] • <pagesetup>::= pagesetup duep pargl <width> <height> pargr semicolon • <width>::= width duep qcifre semicolon • <height>::= height duep qcifre semicolon • <settings>::= settings duep pargl <startend> <year> <output_path> <month_settings>+ pargr semicolon • <startend>::=startmonth duep month semicolon endmonth duep month semicolon • <year>::= year duep qcifre semicolon • <outputpath>::= output duep path semicolon • <monthsettings>::=month duep pargl image duep path semicolon [<type>] pargr semicolon • <daylist>::= days pargl (<birthday> | <holiday>| <appointment>)* pargr • <birthday>::= birthday duep pargl (<date> text_with_spaces semicolon)* pargr semicolon • <holiday>::= holiday duep pargl (<date> text_with_spaces semicolon)* pargr semicolon • <appointment>::= appointment duep pargl (<date> text_with_spaces semicolon)* pargr semicolon • <date>::= giorno slash month • <type>::=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 phrase CalendarLexer Token CommonTokenStream CalendarGUI CalendarParser CommonTree CommonTreeNodeStream CalendarTree Output configura run consistentCheck Engine

  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.

More Related