140 likes | 256 Views
FantaManager. Linguaggio per descrivere e visualizzare graficamente una squadra di calcio. Prospero Rossini Linguaggi e modelli computazionali LS. Obiettivi del Progetto. Si vuole realizzare un sistema che permetta di:. ?. Definizione della Grammatica.
E N D
FantaManager Linguaggio per descrivere e visualizzare graficamente una squadra di calcio. Prospero Rossini Linguaggi e modelli computazionali LS
Obiettivi del Progetto Si vuole realizzare un sistema che permetta di: ?
Definizione della Grammatica • In questo caso vogliamo definire una serie di informazioni riferite ad una squadra di calcio, in particolare: Di seguito, la definizione della grammatica in notazione BNF G = <VT,VN,P, S >
Grammatica (1/3) S ::= Formazione <EOF> Formazione::= <NOME_SQUADRA> NomeSquadra Team NomeSquadra ::= <NOME> Team ::= <SCHEMA> Schema Tabellino | Tabellino Schema ::= <DIFESA> Difesa Tabellino ::= <FORMAZIONE> ElencoTitolari( Riserve )? Riserve ::= <RISERVE> ElencoRiserve Difesa ::= ( Difesa_5 <T> <CENTROCAMPO> Modulo_D5 | Difesa_4 <T> <CENTROCAMPO> Modulo_D4 | Difesa_3 <T> <CENTROCAMPO> Modulo_D3 ) Modulo_D3 ::= ( Modulo_D3_C5_A2 | Modulo_D3_C4_A3 ) Modulo_D3_C5_A2 ::= Centrocampo_5 <T> <ATTACCO> Attacco_2 Modulo_D3_C4_A3 ::= Centrocampo_4 <T> <ATTACCO> Attacco_3 Scopo Formazione NomeSquadra Team Schema “TEAM ” è composto da <SCHEMA> “SCHEMA” e “TABELLINO” oppure solo da “TABELLINO” Tabellino “TABELLINO ” è composto da <FORMAZIONE> “ELENCOTITOLARI” e d eventualmente da “RISERVE” Schema
Grammatica (2/3) Modulo_D4 ::= ( Modulo_D4_C5_A1 | Modulo_D4_C4_A2 | Modulo_D4_C3_A3 ) Modulo_D4_C5_A1 ::= Centrocampo_5 <T> <ATTACCO> Attacco_1 Modulo_D4_C4_A2 ::= Centrocampo_4 <T> <ATTACCO> Attacco_2 Modulo_D4_C3_A3 ::= Centrocampo_3 <T> <ATTACCO> Attacco_3 Modulo_D5 ::= ( Modulo_D5_C4_A1 | Modulo_D5_C3_A2 ) Modulo_D5_C4_A1 ::= Centrocampo_4 <T> <ATTACCO> Attacco_1 Modulo_D5_C3_A2 ::= Centrocampo_3 <T> <ATTACCO> Attacco_2 ElencoTitolari ::= Nome (<COMMA> Nome )* ElencoRiserve ::= Nome (<COMMA> Nome )* Nome ::= <NOME> ( Secondo_Nome )* Secondo_Nome ::= <NOME> Schema Tabellino ::= <TABELLINO> ElencoTitolari (Riserve)? Riserve ::= <RISERVE> ElencoRiserve Nome
Grammatica (3/3) Difesa_3 ::= <TRE> Difesa_4 ::= <QUATTRO> Difesa_5 ::= <CINQUE> Centrocampo_3 ::= <TRE> Centrocampo_4 ::= <QUATTRO> Centrocampo_5 ::= <CINQUE> Attacco_1 ::= <UNO> Attacco_2 ::= <DUE> Attacco_3 ::= <TRE> TOKENS SKIP : { " " | "\t" | "\n" | "\r" | "\f“ } TOKEN: { <NOME_SQUADRA: "[nome squadra]"> | <SCHEMA: "[schema]"> | <DIFESA: "D:"> | <CENTROCAMPO: "C:"> | <ATTACCO: "A:"> | <FORMAZIONE: "[formazione]"> | <RISERVE: "[riserve]"> | <T: “-”> | <COMMA: “,”> | <NOME: ["a"-"z"](["a"-"z"])*("è”)*(“è”)*(“ù”)*(“ù”)*(“ò”)* (“ ’ ”)*(“à”)*([“a”-“z”])*([“-”])*([“a”-“z"])*(“è”)* (“è”)*(“ù”)*(“ò”) *(“à”)*(“ù”)*(“ ‘ ”)([“a”-“z”])* ([“0”-“9”])*> }
Analisi della Grammatica(1/2) • Secondo la classificazione di Chomsky la grammatica è di TIPO 2 (Context-Free) in quanto le produzioni hanno tutte la forma • A→α , conα є (VT U VN)* ed A є VN TIPO 0 TIPO 1 GRAMMATICHE TIPO 2 • …tuttavia, non presenta Self-Embedding. • Non esiste nessun simbolo non terminale A tale che: A =>* α1A α2, con α1, α2є V+ ed A є VN TIPO 3 • Teorema • Una Grammatica Context-Free (Tipo 2) che non contenga Self-Embedding genera un Linguaggio Regolare. LINGUAGGI
Analisi della Grammatica(2/2) • La grammatica è LL(1)? Per le grammatiche di TIPO 2, l’automa riconoscitore è un PDA (Push Down Automaton => ASF + Stack) che utilizza l’analisi ricorsiva discendente (analisi TOP-DOWN) GRAMMATICHE LL(k) La classe di Grammaiche LL(K) è caratterizzata dalla possibilità di analizzare le frasi Left-To-Right applicando la Left-MostDerivation, utilizzando al più k simboli della frase per scegliere con certezza la produzione opportuna per la riscrittura • Condizione necessaria e sufficiente perché una Grammatica Context-Free sia LL(1) è che per ogni metasimbolo che appare nella parte sinistra di più produzioni, i DIRECTOR-SYMBOLS (DS) relativi a produzioni alternative siano disgiunti Ogni metasimbolo che appare nella parte più a sinistra di più produzioni, ha gli Starter Symbols corrispondenti alle parti destre di queste produzioni alternative, disgiunti. • …tuttavia, sappiamo che: • SS(α) seα non genera mai ε • DS(A α) • SS(α) U FOLLOW(A) se α può generare ε Team ::= <SCHEMA> Schema Tabellino | Tabellino Difesa ::= ( Difesa_5 <T> <CENTROCAMPO> Modulo_D5 | Difesa_4 <T> <CENTROCAMPO> Modulo_D4 | Difesa_3 <T> <CENTROCAMPO> Modulo_D3 ) Modulo_D3 ::= ( Modulo_D3_C5_A2 | Modulo_D3_C4_A3 ) Modulo_D4 ::= ( Modulo_D4_C5_A1 | Modulo_D4_C4_A2 | Modulo_D4_C3_A3 ) Modulo_D5 ::= ( Modulo_D5_C4_A1 | Modulo_D5_C3_A2 ) La GRAMMATICA è LL(1)!
Esempio [nome squadra] MyTeam [schema] D:3 - C:4 - A:3 [formazione] Storari, Balzaretti, Nesta, Ziegler, Seedorf, Maggio, Mariga, Gattuso, Milito, Totti, Acquafresca [riserve] Dida, Juan, Grosso, FerreiraPinto, Sneijder, Balotelli, Amauri S::=Formazione<EOF> Formazione::= <NOME_SQUADRA>NomeSquadra Team NomeSquadra::= <NOME> Team ::= <SCHEMA>Schema Tabellino Schema ::= <DIFESA>Difesa Tabellino ::= <FORMAZIONE>ElencoTitolariRiserve Difesa::= Difesa_3 <T> <CENTROCAMPO> Modulo_D3 Difesa_3 ::= <TRE> Modulo_D3 ::= Modulo_D3_C4_A3 Modulo_D3_C4_A3 ::= Centrocampo_4 <T> <ATTACCO> Attacco_3 Centrocampo_4 ::= <QUATTRO> Attacco_3 ::= <TRE> ElencoTitolari::= Nome (<COMMA> Nome)* Riserve ::= <RISERVE> ElencoRiserve ElencoRiserve::= Nome (<COMMA> Nome)*
Schema di Funzionamento • File Excel contenete le statistiche relative ad una determinata giornata del campionato di Serie A. • (disponibile sul sitohttp://www.fantagazzetta.com) • Utilizzato per determinare: • quali giocatori sono scesi in campo e quindi appartengono alla formazione titolare da visualizzare (possibilità di effettuare delle sostituzioni se sono state inserite le “riserve”); • quali giocatori hanno segnato un goal, oppure sono stati ammoniti, espulsi ecc. ecc. (eventi che possono essere mostrati graficamente all’utente) • il punteggio associato ad un giocatore e quindi il punteggio totale realizzato schierando la formazione specificata in input. Scanner Parser Visitor
Package • contiene tutte le classi necessarie per la gestione dei giocatori e della squadra • contiene le classi per la “gestione” dei file. • Il parser effettua anche alcuni controlli semantici: • verifica che l’elenco dei titolari comprenda esattamente 11 giocatori; • verifica che l’elenco delle riserve comprenda al più 7 giocatori • verifica che non sia stato inserito più volte lo stesso giocatore • La classe TeamMaker effettua anche alcuni controlli: • verifica che i nomi dei giocatori siano tutti “validi”; • quando il modulo è stato inserito in input controlla che questo sia compatibile con il ruolo dei giocatori schierati come titolari; • quando il modulo non è stato introdotto in input verifica che il ruolo dei giocatori inseriti come titolari non determini uno schema non valido • grazie alla tecnica del double-dispatch visita l’albero (APT) e realizza la funzione di interpretazione • classe creata automaticamente; • effettua l’analisi lessicale (individua i token che compongono la stringa in input). • classe creata automaticamente; • effettua l’analisi sintattica(verifica che una frase possa essere costruita in base alle regole della grammatica); • produce una rappresentazione interna della frase – albero. • package creato automaticamente; • contiene le classi necessarie per la costruzione dell’albero.
Sviluppi Futuri • Possibilità di gestire un database di giocatori, che nel caso specifico corrisponde alla “rosa” dei giocatori della squadra e quindi prevedere la realizzazione di un wizard per la creazione/modifica di questo database e per l’inserimento della formazione. • Mantenere delle informazioni sui punteggi dei della “rosa”, offrendo all’utente la possibilità di consultare queste statistiche quando sceglie una nuova formazione. (si potrebbero creare dei grafici che utilizzano questi dati, visualizzano l’andamento delle prestazioni di ogni singolo giocatore nelle ultime “k” partite) Demo