+ Checkout Fabio Ferretti Linguaggio per la gestione di una cassa Progetto per l’esame di Linguaggi e Modelli Computazionali LS Anno Accademico: 2009-2010 + Obiettivi del progetto Creare un linguaggio per gestire le operazioni della cassa di un negozio Inserimento di prodotti per la vendita Dettagli dei prodotti disponibili Vendita al cliente Creare un interprete che controlli le frasi inserite dall’utente Simulare i meccanismi di una normale cassa Gestire la persistenza dei dati e fornirne una rappresentazione tabellare + Grammatica – Non Terminali Scopo della grammatica: <S> ::= <CHK> <CHK> ::= <InserisciProdotto>| <DettagliProdotti> | <AggiornaProdotto> | <VendiProdotto> | <RimuoviProdotto> | <CercaProdotto> Operazioni principali: <InserisciProdotto> ::= inserisci <Prodotto> <DettagliProdotti> ::= dettagli prodotti <DUE_PUNTI> <PGS> <PGD> <AggiornaProdotto> ::= aggiorna <CercaProdotto> <PGS> <ParametriOpzionaliProdotto> <PGD> <VendiProdotto> ::= vendi ( <CercaProdotto> <PGS> <Quantita> <PGD> )+ <RimuoviProdotto> ::= rimuovi <CercaProdotto> <CercaProdotto> ::= prodotto <DUE_PUNTI> <PGS> CODICE_A_BARRE <FRECCIA_DESTRA> <STRINGA> <PUNTO_VIRGOLA> <PGD> Aggiornamento Operazione che dei elimina campi dalopzionali sistema prodotti di un prodotto nella già nel Cerca Rimozione Fornisce Inserisce traal inel prodotti dal sistema sistema sistema presenti i dettagli un diprodotto unauna dei categoria specifica prodotti da vendere diinseriti categoria prodotti quantità indicata sistema + Grammatica – Non Terminali Prodotto: <Prodotto> :: = prodotto <DUE_PUNTI> <PGS> CODICE_A_BARRE <FRECCIA_DESTRA> <STRINGA> Campi <PUNTO_VIRGOLA> PRODUTTORE <FRECCIA_DESTRA> ( <STRINGA> )+ obbligatori <PUNTO_VIRGOLA> per un MODELLO <FRECCIA_DESTRA> ( <STRINGA> )+ <PUNTO_VIRGOLA> nuovo LOTTO_PRODUZIONE <FRECCIA_DESTRA> <STRINGA> <PUNTO_VIRGOLA> prodotto DATA_ACQUISTO <FRECCIA_DESTRA> <Data> <PUNTO_VIRGOLA> <Quantita> PREZZO <FRECCIA_DESTRA> ( <DECIMALE> | <INTERO> ) ( “euro“ | “€“ ) <PUNTO_VIRGOLA> <ParametriOpzionaliProdotto> + Grammatica – Non Terminali Posso avere Caratteristiche opzionali per un prodotto: molteplici colori per uno stesso prodotto <ParametriOpzionaliProdotto> ::= ( COLORE <FRECCIA_DESTRA> ( <STRINGA> )+ <PUNTO_VIRGOLA> )? ( DESCRIZIONE <FRECCIA_DESTRA> ( <STRINGA> )+ <PUNTO_VIRGOLA> )? ( IMMAGINE <FRECCIA_DESTRA> <PERCORSO> <PUNTO_VIRGOLA> )? Posso inserire ( NUMERO_TELEFONO_PRODUTTORE <FRECCIA_DESTRA> ( <PIU> )* ( <INTERO )+ più descrizioni <PUNTO_VIRGOLA> )? dello stesso ( NUMERO_FAX_PRODUTTORE <FRECCIA_DESTRA> prodotto ( <PIU> )* ( <INTERO )+ <PUNTO_VIRGOLA> )? ( EMAIL_PRODUTTORE <FRECCIA_DESTRA> <STRINGA> ( <PUNTO> <STRINGA> )* <AT> <STRINGA> ( <PUNTO> <STRINGA>)+ <PUNTO_VIRGOLA> )? ( MADE_IN <FRECCIA_DESTRA> <STRINGA> <PUNTO_VIRGOLA> )? + Grammatica – Non Terminali Quantità prodotto: <Quantita> ::= QUANTITA <FRECCIA_DESTRA> <INTERO> <PUNTO_VIRGOLA> Data: <Data> ::= <INTERO> <SEPARATORI_DATA> <INTERO> <SEPARATORI_DATA> <INTERO> + Grammatica - Terminali <PARENTESI_GRAFFA_SINISTRA: “{“> <PARENTESI_GRAFFA_DESTRA: “}“> <DUE_PUNTI: “:“> DELIMITARE <FRECCIA_DESTRA: BLOCCHI “-->“> LOGICI <FRECCIA SINISTRA: “<--“> <#CARATTERE: [“a”-“z“] | [“A”-“Z“] |[“0”-“9“] | “!“ | “?“ | “/“ | “.“ | “-“ | “\“ | “ “ | “,“> <STRINGA: “\““ <CARATTERE> ( <CARATTERE> )* “\““> STRINGHE DEFINIRE <#CIFRA: [“0“-“9“]> <INTERO: [“0“-“9“] (<CIFRA>)*> <DECIMALE: <INTERO> ( “.“ | “,“ ) DEFINIRE NUMERI <INTERO>> <PIU: “+“> <AT: “@“> <PUNTO: “.“> DEFINIRE DATA, EMAIL E NUMERI TELEFONICI <SEPARATORI_DATA: “/“ | “_“ | “.“ | “-“> <#PERCORSO_VALIDO: ([“a“-“z“,“A“-“Z“,“0“-“9“,“ “,“_“])+> <NOME_IMMAGINE: "." ("jpg"|"JPG"|"jpeg"|"JPEG"|"png"|"PNG"|"gif"|"GIF"|"bmp"|"BMP”)> <#PERCORSO_FILE: DEFINIRE URL DI UN’IMMAGINE ("/" < PERCORSO_VALIDO >)+ > <PERCORSO: <PERCORSO_FILE> <NOME_IMMAGINE>> + Esempi frasi del linguaggio Inserisci Prodotto inserisci prodotto: { CODICE_A_BARRE --> "4006381333283"; PRODUTTORE --> "Stabilo"; MODELLO --> "Pen 68"; LOTTO_PRODUZIONE --> "aabb1122"; DATA_ACQUISTO --> 21-10-2011; QUANTITA --> 3; PREZZO --> 0,99 euro; } Vendi Prodotto vendi prodotto: { CODICE_A_BARRE --> "4006381333283"; } { QUANTITA --> 2; } Rimuovi Prodotto rimuovi prodotto: { CODICE_A_BARRE --> "4006381333283"; } Aggiorna Prodotto aggiorna prodotto: { CODICE_A_BARRE --> "4006381333283"; } { COLORE --> "Verde Limone"; DESCRIZIONE --> "PENNARELLO CON PUNTA DI FIBRA PREGIATA. PUNTA INDEFORMABILE. INCHIOSTRO INODORE A BASE DACQUA. PUNTA MEDIA TRATTO 1MM."; IMMAGINE --> /Users/Faust/Desktop/Checkout/ image/Pen_68.jpg; EMAIL_PRODUTTORE --> "info"@"stabilo"."com"; MADE_IN --> "Germania"; } Cerca Prodotto prodotto: { CODICE_A_BARRE --> "4006381333283"; } + Osservazioni sulla grammatica La grammatica, nella parte sinistra delle di tutte le produzioni, presenta un unico simbolo non terminale. Le produzioni hanno la forma: A α con α ∈ (VT∪VN)*, A ∈ VN Secondo la classificazione di Chomsky è una grammatica di Tipo 2 (Context-Free) La grammatica non contiene self-embedding, quindi il linguaggio generato è di Tipo 3 (Regolare) + Osservazioni sulla grammatica La grammatica presenta delle parti di linguaggio opzionali, che possono produrre ε-rules. Per dire che la grammatica sia LL(1) non è più sufficiente che gli Starter Symbols relativi alle parti destre delle produzioni alternative siano disgiunti. E’ necessario dunque considerare i Director Symbols Per le produzioni come A α in cui α può genare la stringa vuota i Director Symbols sono DS(A α) = SS(α) ∪ FOLLOW(A) Nel caso in cui α non generi la stringa vuota i Director Symbols coincidono con gli Starter Symbols Essendo i Director Symbols di produzioni alternative disgiunti, questa è una condizione necessaria e sufficiente per dire che la grammatica è LL(1) E’ possibile quindi applicare l’analisi ricorsiva discendente (Top-Down) Sono introdotti tanti metodi quanti i simboli non terminali, che si occupano di riconoscere il sotto-linguaggio generato dal simbolo non terminale associato da JavaCC, + ArchitetturaPackage delgenerato sistema contiene un lexer per analizzare i singoli token e un parser che effettua l’analisi sintattica Frase del linguaggio Package Visitor generato da JTB. Contiene l’interfaccia del visitor IVoidVisitor e implementazioni con visita DepthFirst PackageVisitor generato da JTB per la costruzione dell’AST Percorre l’albero e svolge le IVoidVisitor operazioniPercorre necessarie effettuando l’albero costruendo controlli sulla una suasemantica rappresentazione DepthFirstVoidVisitor CheckoutDepthFirstVisitor SyntaxTreeDepthFirstVisitor CHKParserTokenManager Parser CHKParser SyntaxTree InserisciProdotto DettagliProdotti Prodotto CercaProdotto ParametriOpzionaliProdotto AggiornaProdotto VendiProdotto RimuoviProdotto Data Quantita + Analisi semantica La classe DepthFirstVoidVisitor è stata estesa da due sottoclassi: CheckoutDepthFirstVisitor: Effettua controlli semantici sulla frase inserita Crea, modifica, rimuove e restituisce righe dalle tabelle del database a seconda delle operazioni richieste SyntaxTreeDepthFirstVisitor: Percorre l’albero e ne crea una sua rappresentazione semplificata omettendo le produzioni non significative Ciascun visitor realizza una visita di tipo depth first avvalendosi del meccanismo del double dispatch + Gestione della persistenza Per l’accesso ai dati è stato impiegato il Pattern DAO (Data Access Object). Il pattern consente di poter sostituire il dispositivo di persistenza senza che questo abbia impatto sulla logica di business. Il sistema è diviso in tre parti: Logica di accesso ai dati Implementazione JDBC, che astrae dal database sottostante Implementazione in accordo allo specifico database + Componenti accessori Il sistema dispone di classi accessorie che svolgono attività secondarie Classi per l’highlighting e la segnalazione di errori nelle frasi del linguaggio inserite nell’editor Classi per la generazione automatica delle frasi del linguaggio Classi per la gestione del flusso di frame proveniente dalla webcam Classi per la lettura di codici a barre, del tipo EAN-13, da immagini + Interfaccia grafica Componenti principali: GraphicaluserInterfaceCheckoutApp Frame che lancia l’applicazione GraphicaluserInterfaceCheckoutView Classe che si occupa della creazione dei vari componenti dell’interfaccia grafica GraphicaluserInterfaceCheckoutAboutBox Finestra di dialogo contenente le informazioni sull’applicazione ConfermaRimozioneCarrello Finestra di dialogo per la rimozione di un prodotto dal carrello e per la conferma della vendita di prodotti ConfermaVendita WebcamFrame Frame che permette di visualizzare le immagini catturate dalla webcam CarrelloTableModel Classe per la gestione delle tabelle nell’interfaccia grafica + Interfaccia grafica Frame provenienti dalla webcam Selezione operazioni di gestione Campi per l’immissione dei dati + Interfaccia grafica Dettagli prodotto selezionato Selezione prodotto + Interfaccia grafica Prodotti che il cliente vuole acquistare Prodotti presenti in negozio + Interfaccia grafica Area per la scrittura delle frasi del linguaggio Albero che rappresenta l’esecuzione di un comando Highlighting del codice Area di notifica per eventuali messaggi di errore + Test e collaudi Suite di test JUnit per verificare la correttezza delle operazioni di lettura e scrittura verso il database File con opportuni errori sintattici e semantici al fine di collaudare il sistema a fronte di situazioni di errore Predisposti opportuni messaggi per segnalare all’utente eventuali errori sintattici e semantici Errori sintattici viene segnalata riga e colonna dell’errore e il carattere inaspettato Errori semantici viene esplicitamente segnalato l’errore + Tecnologie Linguaggio di programmazione Eclipse Helios 3.6.2 NetBeans 7.0.1 Generazione lexer e parser Java 1.6.0_26 Ambienti di sviluppo JavaCC (Plug-in Eclipse) 1.5.24 Generazione visitor e APT Java Tree Builder (Plug-in Eclipse) 1.5.24 Generazione delle documentazione Testing JJDoc 5.0-4 JUnit 4.8.1 Database Oracle MySQL 5.5.14 Limiti e sviluppi futuri + Supporto da parte del linguaggio dell’aspetto fiscale legato alle transazioni Estensione del linguaggio con nuove operazioni Gestione di più negozi, con eventuali scambi tra di essi Gestione di categorie di prodotti differenziate, ad esempio alimentari, farmaceutici, elettrici… Supporto a webcam non QuickTime compatibili Riconoscimento di codici a barre diversi da quelli in formato EAN-13