220 likes | 367 Views
Fabio Ferretti. Progetto per l’esame di Linguaggi e Modelli Computazionali LS. Checkout. Linguaggio per la gestione di una cassa. Anno Accademico: 2009-2010. Obiettivi del progetto. Creare un linguaggio per gestire le operazioni della cassa di un negozio
E N D
Fabio Ferretti Progetto per l’esame di Linguaggi e Modelli Computazionali LS Checkout Linguaggio per la gestione di una cassa 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 <S> ::= <CHK> <CHK> ::= <InserisciProdotto>| <DettagliProdotti> | <AggiornaProdotto>| <VendiProdotto> | <RimuoviProdotto>| <CercaProdotto> • Scopo della grammatica: • 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> Operazione che elimina dal sistema prodotti nella quantità indicata Aggiornamento dei campi opzionali di un prodotto già nel sistema Cerca tra i prodotti presenti una specifica categoria Rimozione dal sistema di una categoria di prodotti Fornisce al sistema i dettagli dei prodotti inseriti Inserisce nel sistema un prodotto da vendere
Grammatica – Non Terminali <Prodotto> :: =prodotto <DUE_PUNTI> <PGS>CODICE_A_BARRE <FRECCIA_DESTRA> <STRINGA><PUNTO_VIRGOLA> PRODUTTORE <FRECCIA_DESTRA> ( <STRINGA> )+ <PUNTO_VIRGOLA> MODELLO<FRECCIA_DESTRA> ( <STRINGA> )+ <PUNTO_VIRGOLA> LOTTO_PRODUZIONE<FRECCIA_DESTRA> <STRINGA> <PUNTO_VIRGOLA> DATA_ACQUISTO<FRECCIA_DESTRA> <Data> <PUNTO_VIRGOLA> <Quantita> PREZZO<FRECCIA_DESTRA> ( <DECIMALE> | <INTERO> ) ( “euro“ | “€“ ) <PUNTO_VIRGOLA> <ParametriOpzionaliProdotto> <PGD> • Prodotto: Campi obbligatori per un nuovo prodotto
Grammatica – Non Terminali Posso avere 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> )? ( NUMERO_TELEFONO_PRODUTTORE<FRECCIA_DESTRA> ( <PIU> )* ( <INTERO )+ <PUNTO_VIRGOLA> )? ( NUMERO_FAX_PRODUTTORE<FRECCIA_DESTRA> ( <PIU> )* ( <INTERO )+ <PUNTO_VIRGOLA> )? ( EMAIL_PRODUTTORE<FRECCIA_DESTRA> <STRINGA> ( <PUNTO> <STRINGA> )* <AT> <STRINGA> ( <PUNTO> <STRINGA>)+ <PUNTO_VIRGOLA> )? ( MADE_IN<FRECCIA_DESTRA> <STRINGA> <PUNTO_VIRGOLA> )? • Caratteristiche opzionali per un prodotto: Posso inserire più descrizioni dello stesso prodotto
Grammatica – Non Terminali • Quantità prodotto: <Quantita> ::= QUANTITA <FRECCIA_DESTRA> <INTERO> <PUNTO_VIRGOLA> • Data: <Data> ::= <INTERO> <SEPARATORI_DATA> <INTERO> <SEPARATORI_DATA> <INTERO>
Grammatica - Terminali DELIMITARE BLOCCHI LOGICI <PARENTESI_GRAFFA_SINISTRA: “{“> <PARENTESI_GRAFFA_DESTRA: “}“> <DUE_PUNTI: “:“> <FRECCIA_DESTRA: “-->“> <FRECCIA SINISTRA: “<--“> DEFINIRE STRINGHE <#CARATTERE: [“a”-“z“] | [“A”-“Z“] |[“0”-“9“] | “!“ | “?“ | “/“ | “.“ | “-“ | “\“ | “ “ | “,“> <STRINGA: “\““ <CARATTERE> ( <CARATTERE> )* “\““> DEFINIRE NUMERI <#CIFRA: [“0“-“9“]> <INTERO: [“0“-“9“] (<CIFRA>)*> <DECIMALE: <INTERO> ( “.“ | “,“ ) <INTERO>> <PIU: “+“> <AT: “@“> <PUNTO: “.“> <SEPARATORI_DATA: “/“ | “_“ | “.“ | “-“> DEFINIRE DATA, EMAIL E NUMERI TELEFONICI <#PERCORSO_VALIDO: ([“a“-“z“,“A“-“Z“,“0“-“9“,“ “,“_“])+> <NOME_IMMAGINE: "." ("jpg"|"JPG"|"jpeg"|"JPEG"|"png"|"PNG"|"gif"|"GIF"|"bmp"|"BMP”)> <#PERCORSO_FILE: ("/" < PERCORSO_VALIDO >)+ > <PERCORSO: <PERCORSO_FILE> <NOME_IMMAGINE>> DEFINIRE URL DI UN’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; } 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"; } Vendi Prodotto vendi prodotto: { CODICE_A_BARRE--> "4006381333283"; } { QUANTITA --> 2; } Cerca Prodotto Rimuovi Prodotto prodotto: { CODICE_A_BARRE--> "4006381333283"; } rimuoviprodotto: { 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 DirectorSymbols Per le produzioni come A α in cui α può genare la stringa vuota i DirectorSymbols sono DS(A α) = SS(α) ∪ FOLLOW(A)Nel caso in cui α non generi la stringa vuota i DirectorSymbols coincidono con gli Starter Symbols Essendo i DirectorSymbols 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
Package generato da JavaCC, contiene un lexer per analizzare i singoli token e un parser che effettua l’analisi sintattica Architettura del sistema Parser CHKParserTokenManager CHKParser Frase del linguaggio Package Visitor generato da JTB. Contiene l’interfaccia del visitorIVoidVisitor e implementazioni con visita DepthFirst SyntaxTree Package generato da JTB per la costruzione dell’AST Visitor Percorre l’albero e svolge le operazioni necessarie effettuando controlli sulla semantica IVoidVisitor InserisciProdotto DettagliProdotti Percorre l’albero costruendo una sua rappresentazione DepthFirstVoidVisitor Prodotto CercaProdotto ParametriOpzionaliProdotto AggiornaProdotto CheckoutDepthFirstVisitor SyntaxTreeDepthFirstVisitor 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 Classe che si occupa della creazione dei vari componenti dell’interfaccia grafica GraphicaluserInterfaceCheckoutView Finestra di dialogo contenente le informazioni sull’applicazione GraphicaluserInterfaceCheckoutAboutBox 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 • Java 1.6.0_26 • Ambienti di sviluppo • EclipseHelios 3.6.2 • NetBeans 7.0.1 • Generazione lexer e parser • JavaCC (Plug-in Eclipse)1.5.24 • Generazione visitor e APT • Java Tree Builder (Plug-in Eclipse) 1.5.24 • Generazione delle documentazione • JJDoc 5.0-4 • Testing • JUnit 4.8.1 • Database • Oracle MySQL5.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