260 likes | 401 Views
Linguaggio per la modellazione e presentazione web di eventi turistici a tappe. Attività progettuale per il corso di Linguaggi e Modelli Computazionali M. Professore: Studente: Enrico Denti Thomas Ricci. Scopo del Progetto.
E N D
Linguaggio per la modellazione e presentazione web di eventi turistici a tappe.Attività progettuale per il corso diLinguaggi e Modelli Computazionali M Professore: Studente: Enrico Denti Thomas Ricci
Scopo del Progetto • Sviluppo di un linguaggio semplice e intuitivo ma allo stesso flessibile e completo per la modellazione di un itinerario turistico riguardante un “evento a tappe”, al fine di automatizzare la generazione di una presentazione dell’itinerario con tecnologie Web 2.0: • Migliorare l’esperienza di navigazione degli utenti web fornendo contenuti interattivi di qualità per la presentazione di un evento (piuttosto che semplici contenuti testuali).
Caratteristiche del linguaggio • 3 tipologie di “evento a tappe”: • RACE: Manifestazioni sportive su strada senza punti di sosta (gare ciclistiche, rally automobilistici,…). • TOUR: Itinerari culturali/enogastronomici che prevedono punti di sosta con eventuale visita. • SAIL-RACE: Regate. • Il linguaggio consente di definire le informazioni generali sull’evento: • Periodo evento • Descrizione evento • Elenco delle tappe previste • … e quelle specifiche in base alla tipologia, come ad esempio: • Statistiche di gara nel caso di eventi sportive. • Informazioni culturali e contatti nel caso di itinerari per eventi culturali.
La Grammatica • TOKEN: A_GR : '{' ; C_GR : '}' ; fragment DIGIT : ( '0'..'9'); INT : DIGIT+; FLOAT : DIGIT+ '.' DIGIT+; DATE : DIGIT DIGIT '/' DIGIT DIGIT '/' (DIGIT DIGIT | DIGITDIGITDIGITDIGIT); ORARIO : DIGIT DIGIT ':' DIGIT DIGIT; STRING: '"' ( ESC_SEQ | ~('\\'|'"') )* '"'; fragmentHEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ; fragmentESC_SEQ : '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\') | UNICODE_ESC | OCTAL_ESC; fragmentOCTAL_ESC: '\\' ('0'..'3') ('0'..'7') ('0'..'7‘)| '\\' ('0'..'7') ('0'..'7')| '\\' ('0'..'7'); fragmentUNICODE_ESC : '\\' 'u' HEX_DIGITHEX_DIGITHEX_DIGITHEX_DIGIT; WS : ( ‘ ‘ | ‘\t’ | ‘\r‘ | ‘\n‘ ) {$channel=HIDDEN;};
La Grammatica • TOKEN:
La Grammatica G = <VT, VN, P, S> • PRODUZIONI: s ::= <EVENT> <STRING> <A_GR> descriptionperiod( race|tour | sail_race ) <C_GR> Lo scopo della grammatica è il simbolo non terminale s e la relativa produzione prevede che un evento inizi con la keyword “event” seguita da: • Nome evento • Descrizione dell’evento description ::= <INFO> <STRING> • Periodo evento period ::= <DATA> (<DATE> | “da” <DATE> “a” <DATE>) • Tipologia di evento… • Esempio: • event “Giro d’Italia 2011” • { • info “…descrizione dell’evento…” • data da 20/05/11 a 22/05/11 […tipo evento: tour|race|sail_race…] • }
La Grammatica: Race race ::= <RACE> <A_GR> ( stage|poi )+ <C_GR> Una race rappresenta una manifestazione sportiva a tappe che non prevede punti di sosta lungo il percorso ma solo: • Tratti di gara stage ::= <STAGE> (“by” (<BIKE> | <CAR>))? <STRING> <A_GR> partenza (indirizzo)* arrivo (period)? (km_tot)? ( pend_prc )? ( pend_max )? ( disliv)? description <C_GR> • PointsofInterests (non necessariamente sul percorso) poi ::= (<RIST>|<MED>|<MEC>|<GAS>) <STRING><A_GR> <Indirizzo> (contatti )? <C_GR>
stage ::= <STAGE> (“by” (<BIKE> | <CAR>))? <STRING> <A_GR> partenza (indirizzo)* arrivo (period)? (km_tot)? ( pend_prc )? ( pend_max )? ( disliv)? description <C_GR>km_tot ::= <KM_TOT> (<INT>|<FLOAT>) alt ::= <ALT> (<FLOAT>|<INT>) disliv ::= <DISLIV> (<FLOAT>|<INT>) pend_prc ::= <PEND_PRC> <FLOAT> pend_max ::= <PEND_MAX> <INT> La Grammatica: Race • Esempio: race { stage by bike "Cesenatico - Polenta“ { departure "Portocanale di Cesenatico“ { addr "via Cesenatico 10, Cesenatico" h 05:00 img“http://www.cesenaticoholidays.com/images/eventi/noveColli/partenza_noveColli.jpg“ } addr "Via San Pellegrino 5, Cesenatico“ addr "Via Collinello, Bertinoro" arrival "Polenta“ { addr "via Polenta 477, Polenta, Bertinoro“ km 37 alt 287 } data 20/05/10 km_tot 34 pend_% 3.06 pend_max 13 disliv 284 info "Dopo essersi lasciati alle spalle il mare di Cesenatico,...“ } firstAid "Ospedale Bufalini" { addr "viale Ghirotti 286, Cesena" tel 0547352111 website "www.ausl-cesena.emr.it"} } partenza ::= <DEP> <STRING> <A_GR> (indirizzo | coordinates) (km)? (alt)? (time)? ( img )? <C_GR> poi ::= (<RIST>|<MED>|<MEC>|<GAS>) <STRING> <A_GR> indirizzo ( contatti )? <C_GR>contatti ::= (tel| email|web)+ tel ::= <TEL> <INT> email ::= <EMAIL> <STRING> web ::= <WEB> <STRING> indirizzo ::= <ADDR> <STRING> arrivo ::= <ARR> <STRING> <A_GR> (indirizzo | coordinates) (km)? (alt)? (time)? ( img )? <C_GR>
La Grammatica: Tour tour ::= <TOUR> <A_GR> ( destination | stage | poi )+ <C_GR> Un tour rappresenta un evento con eventuali mete da visitare lungo il percorso (esempi: tour culturali/enogastronomici, raduni d’auto d’epoca, …). Un tour prevede la possibilità di definire: • Punti di sosta di rilevanza turistica. destination ::= <DEST> <STRING> <A_GR> indirizzo (km)? (contatti)? (period)? description> (<img>)? <C_GR> • Percorsi per raggiungere le destinazioni / eventuali tratti di gara (es. raduni auto d’epoca). stage ::= <STAGE> (“by” (<BIKE> | <CAR>))? <STRING> <A_GR> partenza (indirizzo)* arrivo (period)? (km_tot)? ( pend_prc )? ( pend_max )? ( disliv)? description <C_GR> • PointsofInterests (non necessariamente sul percorso) poi ::= (<RIST>|<MED>|<MEC>|<GAS>) <STRING> <A_GR> <Indirizzo> (contatti )? <C_GR>
La Grammatica: Tour destination ::= <DEST> <STRING> <A_GR> indirizzo (km)? (contatti)? (period)? description (<img>)? <C_GR> • Esempio: tour { dest “Museo della Marineria di Cesenatico” { addr "via Cesenatico 10, Cesenatico" km 10 tel 0547 80375 date 31/10/10 info “museo allestito sul portocanale di Cesenatico…“img “http://www.cesenatico.it/img/museo.jpg” } gas “Distributore ESSO“ { addr “Statale Adriatica, Tagliata di Cervia" tel 054433390 } … } description ::= <INFO> <STRING> img ::= <IMG> <STRING> contatti ::= (tel| email|web)+ tel ::= <TEL> <INT> email ::= <EMAIL><STRING> web ::= <WEB> <STRING> km ::= <KM> (<FLOAT>|<INT>) poi ::= (<RIST>|<MED>|<MEC>|<GAS>) <STRING> <A_GR> indirizzo ( contatti )? <C_GR>
La Grammatica: Sail Race sail_race::= <SAIL><A_GR> ( lap| poi )+ <C_GR> Una sail race rappresenta una regata ed è costituita da una serie di: • Rotte della regata: lap ::= <LAP> <STRING> <A_GR> partenza ( coordinates | boa )+ arrivo ( description )? <C_GR> • PointsofInterests (non necessariamente sul percorso) poi ::= (<RIST>|<MED>|<MEC>|<GAS>) <STRING> <A_GR> <Indirizzo> (contatti )? <C_GR>
La Grammatica: Sail Race boa ::= <BOA> <A_GR> coordinates ( miles )? <C_GR> coordinates ::= <COORD> <A_GR> latlng <C_GR> lat ::= <LAT> <FLOAT> lng ::= <LNG> <FLOAT>miles ::= <MI> (<FLOAT>|<INT>) coordinates ::= <COORD> <A_GR> latlng <C_GR> lat ::= <LAT> <FLOAT> lng ::= <LNG> <FLOAT> • Esempio: sail{ lap "Tappa Cesenatico-Cervia“ { departure "Congrega Velisti Cesenatico" { coordinates { lat 44.210821 lng 12.395849 } } coordinates { lat 44.226707 lng 12.424579 } boa { coordinates { lat 44.229414 lng 12.431617 } } coordinates { lat 44.266745 lng 12.378703 } coordinates { lat 44.269745 lng 12.368703 } arrival "Portocanale di Cervia“ { coordinates { lat 44.267533 lng 12.356687 } } info "La prima tappa della regata prevede il raggiungimento del portocanale di Cervia." } restaurant “Ristorante da Urbano" { addr "via Lungomare Ponente 1, Cesenatico" tel 0547352111 } } Per la costruzione del percorso della regata tramite coordinate (semplici punti intermedi) e boe. lap ::= <LAP> <STRING> <A_GR> partenza ( coordinates | boa )+ arrivo ( description )? <C_GR> partenza ::= <DEP> <STRING> <A_GR> (indirizzo | coordinates) (km)? (alt)? (time)? ( img )? <C_GR> arrivo ::= <ARR> <STRING> <A_GR> (indirizzo | coordinates) (km)? (alt)? (time)? ( img )? <C_GR>
La Grammatica G = <VT, VN, P, S> • PRODUZIONI: s ::= <EVENT> <STRING> <A_GR> descriptionperiod( tour | race | sail_race ) <C_GR> tour ::= <TOUR> <A_GR> ( destination | stage | poi )+ <C_GR> race ::= <RACE> <A_GR> ( stage|poi )+ <C_GR> sail_race::= <SAIL><A_GR> ( lap| poi )+ <C_GR> destination ::= <DEST> <STRING> <A_GR> indirizzo (km)? (contatti)? (period)? description> (<Img>)? <C_GR> stage ::= <STAGE> (“by” (<BIKE> | <CAR>))? <STRING> <A_GR> partenza (indirizzo)* arrivo (period)? (km_tot)? ( pend_prc )? ( pend_max )? ( disliv)? description <C_GR> lap ::= <LAP> <STRING> <A_GR> partenza ( coordinates | boa )+ arrivo (description)? <C_GR> partenza ::= <DEP> <STRING> <A_GR> (indirizzo | coordinates) (km)? (alt)? (time)? (img )? <C_GR> arrivo ::= <ARR> <STRING> <A_GR> (indirizzo | coordinates) (km)? (alt)? (time)? (img )? <C_GR> poi ::= (<RIST>|<MED>|<MEC>|<GAS>) <STRING> <A_GR> <Indirizzo> (contatti)? <C_GR> boa ::= <BOA> <A_GR> coordinates ( miles )? <C_GR>
La Grammatica description ::= <INFO> <STRING> indirizzo ::= <ADDR> <STRING> period ::= <DATA> (<DATE> | “da” <DATE> “a” <DATE>) time ::= <TIME> <ORARIO> coordinates ::= <COORD> <A_GR> latlng <C_GR> lat ::= <LAT> <FLOAT> lng ::= <LNG> <FLOAT> miles ::= <MI> (<FLOAT>|<INT>) km ::= <KM> (<FLOAT>|<INT>) km_tot ::= <KM_TOT> (<INT>|<FLOAT>) alt ::= <ALT> (<FLOAT>|<INT>) disliv ::= <DISLIV> (<FLOAT>|<INT>) pend_prc ::= <PEND_PRC> <FLOAT> pend_max ::= <PEND_MAX> <INT> img ::= <IMG> <STRING> contatti ::= (tel| email|web)+ tel ::= <TEL> <INT> email ::= <EMAIL> <STRING> web ::= <WEB> <STRING>
Analisi della Grammatica • La grammatica è di tipo 2 (context free) secondo la classificazione di Chomsky in quanto le produzioni sono vincolate alla forma: • … tuttavia non sono presenti produzioni con self-embedding • … pertanto il linguaggio è regolare (tipo 3) A → αcon α є (VT U VN)* ed A є VN A → α1 A α2 con A є VN e α1, α2 є (VN U VT)+
Analisi della Grammatica • La grammatica è LL(1)? • Una grammatica context-freeè LL(1) se per ogni metasimbolo che compare nella parte sinistra di più produzioni alternative, i DIRECTOR SYMBOLS relativi a tali produzioni sono disgiunti. Grammatica è LL(1) grammatica LL(1) è caratterizzata dalla possibilità di analizzare la frasi Leftto right applicando la Left-mostderivation utilizzando al più 1 simbolo della frase per scegliere con certezza la produzione opportuna per la riscrittura. SS(α) se α non genera mai ε-rules DS(A → α) SS(α) U FOLLOW(A) se α può generareε-rules
Strumenti Utilizzati • Linguaggio di programmazione: • C# • IDE di sviluppo: • Visual Studio 2010 • Piattaforma web: • ASP .Net 4.0 • Strumento per generazione automatica di Lexer e Parser: • ANTLR 3.0 • Strumenti di supporto per la valutazione del linguaggio: • Web Services: • Google Geocoding API • Google Directions API
Architettura: Package • Il progetto è stato implementato con una ClassLibrary,EventiATappeLib.dll, che verrà poi utilizzata all’interno di una applicazione web ASP.Net per generare contenuti.
Architettura: Nodi AST • Antlr3.0 non implementa più Pattern Visitor per la valutazione dell’AST… • Estensione della classe CommonTree che rappresenta il generico nodo dell’AST • Package AST: alcuni nodi…
Funzionamento del Sistema LEXER Tokens PARSER AST
Valutazioni • KeyholeMarkup Language • XML basede condivide parte della grammatica di GML dell’Open GeospatialConsortium(standard ISO). • Linguaggio proprietario di Google per la definizione di mappe interattive utilizzate in Google Maps e Google Earth. KmlVisitor • JavaScriptObjectNotation • Linguaggio standard IETF per la definizione di oggetti JavaScript. • l'interprete JavaScript è in grado di eseguire il parsing di una stringa Json tramite una semplice chiamata alla funzione eval() che restituisce l’oggetto JavaScript rappresentato. • Molto utilizzato in ambito Web con teconologiaAjax per lo scambio di dati al posto di XML perché più leggero. JsonVisitor AST HtmlVisitor
Verifica Semantica delle frasi • Errori lessicali e sintattici vengono rilevati direttamente da Lexer e Parser tramite le eccezioni predefinite di Antlr. • Errori semantici gestiti: • Verifica correttezza date e orari. • Verifica esistenza indirizzo richiesto a Google Geocoding • Verifica correttezza sintattica URL immagine • Verifica correttezza sintattica indirizzi email
Collaudo • Per il collaudo sono stati realizzati alcuni esempi delle tre tipologie di evento… tra cui un evento ciclistico reale! • I contenuti web della Nove Colli 2011 ad un mese dalla pubblicazione, hanno avuto un notevole successo: • Apprezzamento degli utenti web che hanno manifestato un grande interesse per l’evento in termini di visite alla pagina e richieste di prenotazione nel periodo dell’evento.
Sviluppi futuri • Limiti: • Contenuti attualmente presentati prevalentemente testuali… manca la possibilità di introdurre video e photogallery dell’evento. • Sviluppi Futuri: • Estensioni del linguaggio per integrare informazioni sull’evento: • Mash-upcon Wikipedia per integrare informazioni turistiche. • Aggiunta contenuti multimediali da Youtube e Flickr • Potenziamento sezione gestionale nel CMS al fine di affiancare all’attuale editor del linguaggio un wizard per l’inserzione nuovi eventi che generi in modo trasparente all’utente le frasi del linguaggio.