+
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
Scarica

Presentazione Progetto Checkout Linguaggi e Modelli