Prova Nazionale per lesame di Stato della scuola secondaria di I grado.
+ Checkout Linguaggio per la gestione di una cassa Progetto per lesame di Linguaggi e Modelli...
-
Upload
crocifisso-rossi -
Category
Documents
-
view
213 -
download
0
Transcript of + Checkout Linguaggio per la gestione di una cassa Progetto per lesame di Linguaggi e Modelli...
+
CheckoutLinguaggio per la gestione di una cassa
Progetto per l’esame di
Linguaggi e Modelli Computazionali LS
Fabio Ferretti
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
+
Cerca tra i prodotti presenti una specifica categoriaRimozione dal sistema di una categoria di prodottiOperazione che elimina dal sistema prodotti nella quantità indicataAggiornamento dei campi opzionali di un prodotto già nel sistemaFornisce al sistema i dettagli dei prodotti inseritiInserisce nel sistema un prodotto da vendere
Grammatica – Non Terminali Scopo della grammatica:
<S> ::= <CHK><CHK> ::= <InserisciProdotto>| <DettagliProdotti> | <AggiornaProdotto> | <VendiProdotto> | <RimuoviProdotto> | <CercaProdotto>
<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>
Operazioni principali:
+Grammatica – Non Terminali Prodotto:
<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>
Campi obbligatori
per un nuovo
prodotto
+Grammatica – Non Terminali Caratteristiche opzionali per un 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> )?
Posso avere molteplici colori per uno stesso prodotto
Posso inserire più descrizioni dello stesso prodotto
+Grammatica – Non Terminali
Quantità prodotto:
<Quantita> ::= QUANTITA <FRECCIA_DESTRA> <INTERO> <PUNTO_VIRGOLA>
<Data> ::= <INTERO> <SEPARATORI_DATA>
<INTERO> <SEPARATORI_DATA>
<INTERO>
Data:
+
<#CARATTERE: [“a”-“z“] | [“A”-“Z“] |[“0”-“9“] | “!“ | “?“ | “/“ | “.“ | “-“ | “\“ | “ “ | “,“><STRINGA: “\““ <CARATTERE> ( <CARATTERE> )* “\““>DEFINIRE STRINGHE
Grammatica - Terminali
<PARENTESI_GRAFFA_SINISTRA: “{“><PARENTESI_GRAFFA_DESTRA: “}“><DUE_PUNTI: “:“><FRECCIA_DESTRA: “-->“><FRECCIA SINISTRA: “<--“>DELIMITARE BLOCCHI LOGICI
<#CIFRA: [“0“-“9“]><INTERO: [“0“-“9“] (<CIFRA>)*><DECIMALE: <INTERO> ( “.“ | “,“ ) <INTERO>> DEFINIRE NUMERI
<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 linguaggioInserisci Prodotto
Cerca Prodotto
Vendi Prodotto
Rimuovi Prodotto
Aggiorna Prodottoinserisci 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:{
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";}
prodotto:{
CODICE_A_BARRE --> "4006381333283";}
vendi prodotto:{
CODICE_A_BARRE --> "4006381333283";}{
QUANTITA --> 2;}
rimuovi 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.
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 SymbolsEssendo 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
E’ necessario dunque considerare i Director Symbols
+Architettura del sistema
Frase del linguaggio ParserCHKParserTokenManager
CHKParser
SyntaxTree
InserisciProdotto
CercaProdotto
DettagliProdotti
VendiProdotto
AggiornaProdotto
RimuoviProdotto
QuantitaData
Prodotto
ParametriOpzionaliProdotto
Visitor
IVoidVisitor
DepthFirstVoidVisitor
CheckoutDepthFirstVisitor
SyntaxTreeDepthFirstVisitor
Package Visitor generato da JTB. Contiene l’interfaccia del visitor IVoidVisitor e implementazioni
con visita DepthFirst
Package generato da JavaCC, contiene un lexer per analizzare i singoli token e un parser che
effettua l’analisi sintattica
Percorre l’albero costruendo una sua rappresentazione
Package generato da JTB per la costruzione dell’ASTPercorre l’albero e svolge le
operazioni necessarie effettuando controlli sulla
semantica
+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 accessoriIl 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
ConfermaVendita
ConfermaRimozioneCarrello
GraphicaluserInterfaceCheckoutAboutBox
GraphicaluserInterfaceCheckoutApp
GraphicaluserInterfaceCheckoutView
Frame che lancia l’applicazione
Classe che si occupa della creazione dei vari componenti dell’interfaccia grafica
Finestra di dialogo contenente le informazioni sull’applicazione
Finestra di dialogo per la rimozione di un prodotto dal carrello e per la conferma della vendita di
prodotti
WebcamFrameFrame che permette di visualizzare le immagini
catturate dalla webcam
CarrelloTableModelClasse per la gestione delle tabelle nell’interfaccia
grafica
Componenti principali:
+Interfaccia grafica
Campi per l’immissione dei
dati
Frame provenienti dalla
webcam
Selezione operazioni di
gestione
+Interfaccia grafica
Dettagli prodotto selezionato
Selezione prodotto
+Interfaccia grafica
Prodotti che il cliente vuole acquistare
Prodotti presenti in negozio
+Interfaccia grafica
Area di notifica per eventuali messaggi di
errore
Area per la scrittura delle
frasi del linguaggio
Albero che rappresenta
l’esecuzione di un comando
Highlighting del codice
+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 Eclipse Helios 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 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