210 likes | 552 Views
CineMan Linguaggio per la descrizione della programmazione di cinema. Andrea Decorte. Progetto di Linguaggi e Modelli Computazionali LS. Obiettivi. Progettare un linguaggio per la descrizione della programmazione giornaliera di cinema Tale linguaggio deve essere completo ma comprensibile
E N D
CineManLinguaggio per la descrizione della programmazione di cinema Andrea Decorte Progetto di Linguaggi e Modelli Computazionali LS
Obiettivi • Progettare un linguaggio per la descrizione della programmazione giornaliera di cinema • Tale linguaggio deve essere completo ma comprensibile • Lo scopo sarà quello di produrre una o più rappresentazioni direttamente utilizzabili dall’utente finale • Locandina • File PDF
Analisi del problema • Si dovrà quindi realizzare un interprete per tale linguaggio che prenda in input una stringa di caratteri • Inserita direttamente nella finestra del programma • Caricata da un file di testo • Esso dovrà effettuare l’analisi sintattica e di seguito quella semantica • Nel caso tutte le operazioni abbiano esito positivo verrà prodotta una rappresentazione adeguata • In caso di errore esso verrà segnalato all’utente nel modo più chiaro e dettagliato possibile
Caratteristiche linguaggio Linguaggio dovrà permettere di specificare • Informazioni generali sul cinema • indirizzo • disponibilità parcheggi • numero sale • Orari di apertura • Programmazione delle diverse sale • Per ogni film in programmazione possibilità di inserire le informazioni di base (titolo, durata, divieti …) • Flessibilità (più film per sala, sale chiuse)
Esempio di base CINEMA { NOME: "Cinecity" INDIRIZZO { VIA: "Nazionale" N: 1 Cap: 33040 CITTA: "Pradamano (UD)" } SALE: 1 TEL: 0432/2409500 SITO: "http://udine.cinecity.it" GIORNO: 26/04/2010 ORARIOAP: 15:00 01:00 SALA { NUMSALA: 1 POSTI: 470 FILM: "Scontro tra titani" SPETTACOLI: 17:30 20:00 22:30 DURATA: 101 } }
Alcuni dettagli <NUM: ([“0”-”9”])+> • Ore (e intervalli) • Due numeri separati dai due punti • Date • 3 numeri separati da barre • Formato dd/MM/yyyy • Controlli a livello semantico se data è valida • Stringhe • Racchiuse tra virgolette • Possibilità di includere trattini e caratteri accentati (utili per i titoli dei film) <STRINGA: (["A"-"Z","a"-"z","0"-"9","_","\'",".","à","è","é","ò","ù","ç","ì","È","-"])+>
Grammatica (1/3) Notazione EBNF G = < VT, VN, P, S> Testo ::= "\"" ( <STRINGA> )+ ( <NUM> )* "\"" URI ::= "\"" ( "http://" )? ( <STRINGA> )+ "\"" Data ::= <NUM> "/" <NUM> "/" <NUM> Ora ::= <NUM> ":" <NUM> IntervalloDiTempo ::= OraOra Scope ::= <CINEMA> <LBRACE> ( Cinema )+ <RBRACE> Cinema ::= DatiGiornoOrarioApertura ( Sala )+ Dati ::= "NOME:" TestoIndirizzoNumeroSale (NumeroParcheggi)? Telefono ( "SITO:" URI )* NumeroSale ::= "SALE:" <NUM> NumeroParcheggi ::= "NUMPARCHEGGI:" <NUM> Telefono ::= "TEL:" <NUM> ( "/" )? ( <NUM> )? Stringhe e numeri Parentesi graffa Scope Uno o più cinema Dati sul cinema Barra opzionale
Grammatica (2/3) Indirizzo ::= <INDIRIZZO> <LBRACE> Via CivicoCapCitta <RBRACE> Via ::= ( <VIA> | <PIAZZA> ) Testo Civico ::= <CIVICO> <NUM> Cap ::= <CAP> <NUM> Citta ::= "CITTA:" "\"" (<STRINGA>)+ (Provincia)?"\"" Provincia ::= "(" <PROV> ") " Giorno ::= "GIORNO:" Data OrarioApertura ::= "ORARIOAP:" (IntervalloDiTempo |<CHIUSO>) <VIA: "Via:" | "VIA:" | "VIALE:" | "CORSO:"> Indirizzo <PROV: ["A"-"Z"] ["A"-"Z"]> Data e orario di apertura Cinema chiuso
Grammatica (3/3) Assenti se sala è chiusa Sala ::= <SALA> <LBRACE> NumeroSalaCapienzaSala (<CHIUSO>)? ( InfoFilm )* <RBRACE> NumeroSala ::= "NUMSALA:" <NUM> CapienzaSala ::= "POSTI:" <NUM> InfoFilm ::= "FILM:" Testo ( <FILM3D> )? "SPETTACOLI:" ( Ora )+ DurataFilm (<VM14>)? DurataFilm ::= "DURATA:" <NUM> Info sulla sala Info sul film
Tipologia di grammatica • Grammatica di tipo 2 (context-free) secondo classificazione di Chomsky, cioè • Il linguaggio generato è di tipo 3; no self-embedding, ovvero presenza di simboli non terminali autoinclusivi del tipo • LL(1) perché nessuna produzione genera stringa vuota e gli insiemi degli starter symbols corrispondenti alla parte destra delle produzioni alternative di uno stesso metasimbolo sono tra loro disgiunti A → α con α є (VT U VN)* e A є VN A → β A δ dove A є VN e δ,β є V+
Schema funzionamento (1/2) ParseCinemaTokenManager Sequenza di caratteri Scanner Sequenza di token ParseCinema AST Parser Rappresentazione della frase
Schema funzionamento (2/2) TreeVisitor AST DataVisitor
Controlli semantici • Nel DataVisitor vengono effettuati alcuni controlli sulla correttezza semantica • Numero sale corrispondente a quelle descritte • Nessun film proiettato in caso di chiusura • Controllo sulla correttezza di orari e date • Controllo su CAP • Verifica che URL sia valida
Strumenti utilizzati • Linguaggio Java (JDK 1.6.17) • NetBeans 6.8 come ambiente di sviluppo • JavaCC 5.0 per il parser, sfruttando JJDoc per la creazione automatica di documentazione • Java Tree Builder (JTB) 1.3.2 per la creazione dei visitor di base • Libreria iText 5.0.2 per la creazione di file PDF
Architettura (1/2) • I package sono stati suddivisi in 2 parti • Contengono le classi create in automatico dagli strumenti usati a partire dalla grammatica • Il package parser contiene il parser prodotto in output da JavaCC • I package visitor e syntaxtree vengono invece prodotti da JTB • visitor: interfaccia del visitor base e implementazioni di default • syntaxtree: una classe Java per ogni produzione della grammatica
Architettura (2/2) • Questi package sono stati invece sviluppati manualmente • Il package cineman contiene le classi per rappresentare la struttura in memoria Cinema.java Data.java Film.java Indirizzo.java Sala.java CinemaException.java
Visitor • Nel package cinevisitor si trovano due implementazioni dell’interfaccia Visitor prodotta da JTB • DataVisitor • Si occupa di effettuare i controlli semantici necessari • Produce una rappresentazione corrispondente • TreeVisitor • Richiamato se il DataVisitor non ha rilevato errori • Produce una rappresentazione ad albero del contenuto • Ciascun visitor realizza una visita di tipo depth first avvalendosi del meccanismo del doubledispatch
GUI (1/2) Albero Area di input Area di output Nel package gui troviamo 2 classi per la visualizzazione dell’interfaccia grafica e una di supporto per il syntaxhighlighting Input accettato correttamente Errore rilevato
GUI (2/2) Rappresentazione in stile locandina Rappresentazione in formato PDF
Prove effettuate • Sono stati effettuati diversi test su programmazioni reali di cinema, anche prevedendo di avere in input più cinema • Il sistema ha gestito correttamente sia errori sintattici: • POSTO: 25 il parser segnala un errore indicando anche la riga in quanto si aspetta POSTI: • Che errori semantici: • Se definisco SALE: 1 ma poi ne inserisco 2, il DataVisitor mi segnala l’errore: Errore semantico: [Il numero delle sale definito non corrisponde a quello effettivo]
Limiti e sviluppi futuri • Possibile estensione delle informazioni prese in considerazione (link a una scheda descrittiva di un film, prezzi e sconti…) • Aggiunta di strumenti per facilitare inserimento dei dati e il loro aggiornamento • Miglioramenti all’interfaccia • Possibilità di visualizzare la locandina di più cinema • Altri formati di output…