220 likes | 364 Views
Università degli Studi di Bologna Facoltà di Ingegneria. ViBiTech. Linguaggio per la gestione di una videoteca e biblioteca domestica. Progetto per l’esame di Linguaggi e Modelli Computazionali L-S. Studente: Veronica Conti. Docente: Enrico Denti. Anno Accademico 2008/2009.
E N D
Università degli Studi di Bologna Facoltà di Ingegneria ViBiTech Linguaggio per la gestione di una videoteca e biblioteca domestica Progetto per l’esame di Linguaggi e Modelli Computazionali L-S Studente: Veronica Conti Docente: Enrico Denti Anno Accademico 2008/2009
Obiettivi del progetto • Progettare un linguaggio che permetta di gestire un archivio di libri e film • Realizzare un interprete per questo linguaggio che controlli gli inserimenti dell’utente e gestisca la persistenza dei dati immessi • Realizzare una visualizzazione a tabelle dei dati persistenti presenti gestiti dall'applicazione ViBiTech
Linguaggio: esempio • Esempio di inserimento di un nuovo libro inserisci libro{ TITOLO "Yoga per negati"; AUTORE "Georg Feuerstein, Larry Payne"; EDITORE "Mondadori"; GENERE "sportivo"; COLLANA "Oscar manuali"; ANNO 2008; NRPAG 372; TRAMA "dalle posizioni all’alimentazione e molto altro"; COSTO 13.50 € ; PROVENIENZAcomprato da: NOME "Veronica"; COGNOME "Conti"; NRTEL 3343211062; il: 22/02/2010; } ViBiTech
Grammatica – NON TERMINALI1 • Scopo: punto di partenza per ogni interazione col sistema • Scelta dell’operazione eseguire <S> ::= <ViBiTech> <ViBiTech> ::= <Inserisci> | <ApriScheda> | <Aggiorna> | <Prestito> | <Rimuovi> <Inserisci> ::= inserisci (<Libro> | <Film>) <ApriScheda> ::= apriScheda (<CercaLibro> | <CercaFilm>) <Aggiorna> ::= aggiorna (<AggiornaLibro> | <AggiornaFilm>) <Prestito> ::= prestito (<CercaLibro> | <CercaFilm>) a<SGRAF> <Persona> <DGRAF>il<SGRAF> <Data><DGRAF> <Rimuovi> ::= rimuovi ( <RimuoviPrestito> | <CercaLibro> | <CercaFilm>) ViBiTech
Grammatica – NON TERMINALI2 • Inserimento di una nuova scheda Campi che qualificano una nuova scheda libro <Inserisci> ::= inserisci (<Libro> | <Film>) <Libro> ::= libro <SGRAF> TITOLO<STRINGA> <PTOVIRG> AUTORE<STRINGA> <PTOVIRG> EDITORE<STRINGA> <PTOVIRG> GENERE<STRINGA> <PTOVIRG> <CampiFacoltativiLibri> <DGRAF> Campi che qualificano una nuova scheda film <Film> ::= film <SGRAF> TITOLO<STRINGA> <PTOVIRG> REGISTA <STRINGA> <PTOVIRG> DURATA<NUM> ( \' | min ) ( . )? <PTOVIRG> GENERE<STRINGA> <PTOVIRG> <CampiFacoltativiFilm> <DGRAF> ViBiTech
Grammatica – NON TERMINALI3 • Apertura di una scheda esistente • Produzioni per il ritrovamento di una scheda in base al titolo <ApriScheda> ::= apriScheda (<CercaLibro> | <CercaFilm>) <CercaLibro> ::= libro <SGRAF> TITOLO<STRINGA> <PTOVIRG> <DGRAF> <CercaFilm> ::= film <SGRAF> TITOLO <STRINGA> <PTOVIRG> <DGRAF> ViBiTech
Grammatica – NON TERMINALI4 • Aggiornamento dei campi facoltativi <Aggiorna> ::= aggiorna (<AggiornaLibro> | <AggiornaFilm>) <AggiornaLibro>::= <CercaLibro> <SGRAF> <CampiFacoltativiLibro> <DGRAF> <CampiFacoltativiLibro> ::= ( COLLANA<STRINGA> <PTOVIRG> )? ( ANNO<NUM> <PTOVIRG> )? ( NRPAG <NUM> <PTOVIRG> )? ( ISBN<ISBN> <PTOVIRG> )? ( TRAMA ( <STRINGA> )+ <PTOVIRG> )? ( COPERTINA<IMGPERCORSO> <PTOVIRG> )? ( COSTO<FLOAT> ( euro | € | \u20ac )? <PTOVIRG> )? ( GIUDIZIO<GIUDIZIO> <PTOVIRG> )? ( PROVENIENZA <Provenienza> )? <AggiornaFilm >::= <CercaFilm> <SGRAF> <CampiFacoltativiFilm> <DGRAF> <CampiFacoltativiFilm> ::= ( ATTORI <STRINGA> ( <VIRG> <STRINGA> )? <PTOVIRG> )? ( ANNO <NUM> <PTOVIRG> )? ( PRODUZIONE <STRINGA> <PTOVIRG> )? ( TRAMA ( <STRINGA> )+ <PTOVIRG> )? ( COPERTINA <IMGPERCORSO> <PTOVIRG> )? ( GIUDIZIO <GIUDIZIO> <PTOVIRG> )? ( <CercaLibro> )? <Provenienza> ::= ( regalato | comprato ) da<DUEPTI> <Persona> il<DUEPTI> <Data> Possibilità di associare il titolo di un libro al film ViBiTech
Grammatica – NON TERMINALI5 • Gestione dei prestiti e della rimozione <Prestito> ::= prestito (<CercaLibro> | <CercaFilm>) a <SGRAF> <Persona> <DGRAF> il<SGRAF> <Data><DGRAF> <Persona> ::= NOME<STRINGA> <PTOVIRG> COGNOME<STRINGA> <PTOVIRG> ( NRTEL ( <NUM> )+ <PTOVIRG> )? <Data> ::= <NUM> <DATASEPARATOR> <NUM> <DATASEPARATOR> <NUM> <PTOVIRG> Campo facoltativo: <Persona> viene usato anche nei campi facoltativi di <Libro> <Provenienza> ::= ( regalato | comprato ) da<DUEPTI> <Persona> il<DUEPTI> <Data> <Rimuovi> ::= rimuovi ( <RimuoviPrestito> | <CercaLibro> | <CercaFilm>) <RimuoviPrestito> ::= prestito ( <CercaLibro> | <CercaFilm> ) ViBiTech
Grammatica – TOKEN • Parole chiave del linguaggio: Per delimitare blocchi logici <SGRAF: "{"> <DGRAF: "}"> <PTOVIRG: ";"> <DUEPTI: ":"> <VIRG: ","> <ISBN: <NUM> "-" <NUM> "-" <NUM> "-" <NUM> "-" <NUM>> <DATASEPARATOR: "/" | "\\" | "_" | "." | "-"> <#PERCORSOFILE: (["a"-"z"] ":\\" | ["A"-"Z"] ":\\" | "..\\" | ".\\")? (<PERCORSOVALIDO> "\\")* | ("/" | "../" | "./")? (<PERCORSOVALIDO> "/")*> <#PERCORSOVALIDO: (["a"-"z","A"-"Z","0"-"9"," ","_","."])+> <IMGPERCORSO: <PERCORSOFILE> <IMGNOME>> <IMGNOME: <PERCORSOVALIDO> "." ("gif" | "GIF" | "jpg" | "JPG" | "png" | "PNG")> <GIUDIZIO: "eccellente" | "ottimo" | "buono" | "discreto" | "mediocre"> <STRINGA: "\"" <LETTER> (<LETTER>)* "\""> <#LETTER: ["a"-"z"] | ["A"-"Z"] | ["0"-"9"] | "!" | "?" | "." | "\'" | " " | ","> <FLOAT: <NUM> ("." | ",") <NUM>> <NUM: ["0"-"9"] (<CIFRA>)*> <#CIFRA: ["0"-"9"]> Per descrivere l’URL di un’immagine di copertina Per la definizione di stringhe Per la definizione di numeri ViBiTech
Considerazioni su grammatica & linguaggio1 • La grammatica presenta un solo simbolo non terminale in tutte le parti sinistre delle produzioni: • A→α con α∈(VT∪VN)*, A ∈VN • Secondo la classificazione di Chomsky è una grammatica context-free(tipo 2) • Non ha produzioni regolari • Alcune produzioni prevedono parti opzionali e possono produrre ε-rules: • <CampiFacoltativiLibro> • <CampiFacoltativiFilm> • Possibilità di eliminazione della stringa vuota tramite tecniche di riscrittura <CampiFacoltativiLibro> ::= ( COLLANA<STRINGA> <PTOVIRG> )? ( ANNO<NUM> <PTOVIRG> )? ( NRPAG <NUM> <PTOVIRG> )? ( ISBN<ISBN> <PTOVIRG> )? ( TRAMA ( <STRINGA> )+ <PTOVIRG> )? ( COPERTINA<IMGPERCORSO> <PTOVIRG> )? ( COSTO<FLOAT> ( euro | € | \u20ac )?<PTOVIRG> )? ( GIUDIZIO<GIUDIZIO> <PTOVIRG> )? ( PROVENIENZA <Provenienza> )? ViBiTech
Considerazioni su grammatica & linguaggio2 • Se la grammatica fosse LL(1) sarebbe sufficiente un solo simbolo per scegliere la produzione da applicare… • La presenza di ε-rules fa venire a meno la condizione sufficiente per la verifica tramite StarterSymbols • Calcolo dei DirectorSymbols • DS(A→α) = SS(α)∪FOLLOW(A) • Insiemi disgiunti • Condizione necessaria e sufficiente verificata! • Analisi Ricorsiva Discendente (top-down) • Una funzione per ogni VN in grado di riconoscere il sottolinguaggio generato da esso • Immediata costruzione del riconoscitore • Il linguaggio generato è regolare (tipo 3) poiché la grammatica non contiene self-embedding ViBiTech
Architettura del sistema1 Package generato in automatico da JTB contenente interfaccia del visitor e implementazione con visita DepthFirst Effettuano l’analisi semantica visitando l’AST grazie al meccanismo del DoubleDispatch. Due differenti funzioni di interpretazione… Scanner generato in automatico da JavaCC; individua i singoli token File.vbt Package generato in automatico da JTB a partire dal file di specifica della grammatica AST Parser generato in automatico da JavaCC; effettua l’analisi sintattica etc… ViBiTech
Architettura del sistema2 • Analisi semantica realizzata dai Visitor • ViBiTechVisitor • Controllo coerenza con labase di dati esistente: • In caso di: • Inserimento creazione di nuova riga nella tabella • Ricerca, Aggiornamento verifica di presenza di una scheda con Prestito, Rimozione titolo coincidente • Rimozione di eventuale effetto collaterale sui prestiti collegati Libro/Film presenti • Controllo sulle date giorno ∈ [1,31], mese ∈ [1,12] • ViBiTechTreeVisitor • Crea una rappresentazione dell’AST utilizzando classi delpackage javax.swing.treeomettendo produzioni non significative ViBiTech
Architettura del sistema3 • Gestione della persistenza: • Pattern DataAccessObject per accesso al DB: • Il cambiamento del dispositivo di persistenza non ha impatto sui componenti di business • Pattern creazionaleFactory per ottenere le implementazioni concrete • Implementazione: DerbyDB Logica di accesso ai dati: If stabiliscono metodi read/write Implementazione JDBC: astrazione dallo specifico DB sottostante Pattern creazionale Pattern creazionale Pattern creazionale Implementazioni in accordo allo specifico DB Logica di business ViBiTech
Architettura del sistema4 • Utilities: • Classi per inizializzare il DB ed effettuare controlli in fase di progettazione • Classi per l’highlighting delle frasi inserite nell’interfaccia grafica • Classi per la gestione di apertura e salvataggio di file in formato .vbt ViBiTech
Architettura del sistema5 • Interfaccia grafica: • Frame che lancia e gestisce l’applicazione • Classi per la gestione delle tabelle nell’interfaccia grafica • Finestra di dialogo per l’eventuale sovrascrittura in fase di salvataggio di file • Frame per la gestione di informazioni sull’applicazione ViBiTech
Package GUI in azione Visualizzazione a tabelle dei dati esistenti Tasti rapidi per l’inserimento di strutture predefinite dei comandi testuali Albero rappresentante l’esecuzione di un comando Area per l’inserimento dei comandi in forma testuale Syntax highlighting Area di notifica per eventuali messaggi di errore ViBiTech
Test e collaudi • Al fine di collaudare il sistema sono stati eseguiti test per verificare la correttezza delle analisi semantiche tramite opportuni file .vbt dati in input • File con sintassi errata • File corretti sintatticamente ma con errori di semantica • Previsione di messaggi opportuni in caso di rilevazione di errori sintattici/semantici • Area apposita per la visualizzazione sull’interfaccia • Suite di test JUnit per verificare la correttezza delle routine DAO ViBiTech
Tecnologie • Linguaggio di programmazione • Java 1.6.0_20 • Ambiente di sviluppo • NetBeans 6.8 • Generazione parser e scanner • JavaCC 5.0 • Generazione documentazione della grammatica • JJDoc • Generazione APT e visitor • Java Tree Builder 1.3.2 • Ambiente di test • JUnit 4.5 ViBiTech
Limiti e caratteristiche non supportate • Assenza di un effettivo collegamento fra film e libri • Realizzare join fra tabelle e inserire controlli semantici in caso sia presenti il campo facoltativo ( <CercaLibro> )? • La funzionalità di apertura di una scheda non produce alcun effetto grafico se non la generazione dell’APT • Predisporre finestra aggiuntiva che si apra mostrando tutti i campi della scheda ViBiTech
Sviluppi futuri... • Interazione con il sistema unicamente attraverso interfaccia grafica • Finestre che si aprono per l’immissione e la modifica dei vari campi • Supporto a diverse modalità di gestione della persistenza • Arricchimento delle funzionalità fornite • Possibilità di visualizzare l’immagine della copertina se inserita • Liste predefinite per il completamento di alcuni campi “relativamente” standard: • Autori tabella associata nel DB • Principali editori • Genere, Giudizio … ViBiTech
Demo START ViBiTech