490 likes | 643 Views
aDiet – Progetto per l’esame di Linguaggi e Modelli Computazionali LS. Prof. Enrico Denti Sviluppato da Fabio Bracci – AA 2009/2010. Idea Progettuale (1). L’idea progettuale è la definizione di un linguaggio che consenta di descrivere una dieta alimentare.
E N D
aDiet – Progetto per l’esame di Linguaggi e Modelli Computazionali LS Prof. Enrico Denti Sviluppato da Fabio Bracci – AA 2009/2010
Idea Progettuale (1) • L’idea progettuale è la definizione di un linguaggio che consenta di descrivere una dieta alimentare. • Però un semplice elenco degli alimentinon ha un gran interesse: sarebbe molto più utile poter fornire anche delle informazioni sulla dieta alimentare. • Per ottenere delle statistiche risulta necessario caratterizzare ogni alimento presente nella dieta con le proprie informazioni sui nutrienti più importanti. • Per fare questo, si potrebbe inserire nella dieta non solo il nome dell’alimento e la sua quantità, ma anche tutti i suoi valori • questo comporta una replicazione delle informazioni nel caso in cui un alimento sia presente più volte nella dieta alimentare •
Idea Progettuale (2) • Si potrebbe realizzare un database degli alimenti, di supporto alla dieta alimentare, contenente tutti i dati sui nutrienti più rilevanti ai fini dietetici, in modo da inserire nella dieta per ogni alimento, non più il nome e la lista dei nutrienti, ma solamente un codice per risalire al medesimo alimento nel database di supporto • Non vi è alcuna replicazione d’informazione • In base alle scelte progettuali quindi, si è scelto di definire non solo un linguaggio per la descrizione di un dieta alimentare maanche di un linguaggio che consenta di descrivere un database alimentare.
Fasi di realizzazione • Definizione di un’opportuna grammatica e di un linguaggio per descrivere un database e una dieta alimentare; • Realizzazione del Parser e dell’Interprete; • Implementazione del sistema con l’aggiunta di GUI; • Collaudo.
Verso la Grammatica (1) • Durante la realizzazione del progetto, la grammatica ha subito dei cambiamenti al fine di rendere il linguaggio di semplice utilizzo (pensando ad un ipotetico utilizzatore finale). • Per far ciò si sono eliminate le parti superflue e resa la grammatica più flessibile possibile (per fare fronte alla soggettività incontrata nel determinare equazioni corrette per il calcolo delle statistiche alimentari). • Ricordando che G = < VT, VN, P, S > • VT e l’insieme dei simboli terminali • VN è l’insieme dei simboli non terminali • P è l’insieme delle produzioni della grammatica • S rappresenta lo scopo
Verso la Grammatica (2) • <ADiet> ::= begin: ( <Database> | <User>) end. • <Database> ::= database:<Categories>enddatabase. • <Categories> ::= category:<Category>endcategory. • <Category> ::= <CATEGORY_NAME> <FoodsCategory> • <FoodsCategory>::=(food:<FoodCategory>endfood.)+ • <FoodCategory> ::= (<NUMBER> (<WORD>)+ <Property>)+ • <Property> ::= composition: <Composition> • <Composition> ::= ( ( <NUTRIEN> ,<NUMBER> ) )+ • <User> ::= user: <Data> <Diet>enduser. • <Data> ::= data: (<WORD>)+ <SEX> <PhisicalData> • <PhisicalData> ::= <BIRTHDAY> <WEIGHT> <HEIGHT> • <Diet> ::= diet: (<Day>)+ enddiet. • <Day> ::= <DAY> <Means> • <Means> ::= (<TIME> <FoodDiets>)+ • <FoodDiets> ::= (<NUMBER> <NUMBER>)+ Il linguaggio risulta troppo complicato per essere poi effettivamente usato.
Grammatica (1) • Per una questione di flessibilità, i token sono stati ridotti al minimo: • <NUMBER> ::=[0-9] ([0-9])* |[0-9] ([0-9])*.([0-9])* • <WORD> ::= [a - z, A-Z,\,-,.,0-9]([a-z,A-Z,\,-,.,0-9])*
Grammatica (2) Grammatica Database • <ADiet> ::= <Database> | <User> <Diet> • <Database> ::= database (<WORD>)+ (<Category>)+ • <Category> ::= category<NUMBER> (<WORD>)+ (<FoodCategory>)+ • <FoodCategory> ::= <NUMBER> (<WORD>)+ <NUMBER> <NUMBER> <NUMBER> <NUMBER> • <User> ::= user (<WORD>)+<NUMBER>/<NUMBER>/<NUMBER><WORD> <NUMBER> kg <NUMBER> cm<NUMBER> • <Diet> ::= diet (<Week>)+ • <Week> ::= week (<Day>)+ • <Day> ::= day (<Meal>)+ • <Meal> ::= (<WORD>)+ <NUMBER> : <NUMBER> (<FoodDiet>)+ • <FoodDiet> ::= <NUMBER> <NUMBER> g Grammatica Dieta
Grammatica Database (1) • <ADiet> ::= <Database> | <User> <Diet> • <Database> ::= database (<WORD>)+ (<Category>)+ • <Category> ::= category<NUMBER> (<WORD>)+ (<FoodCategory>)+ • <FoodCategory> ::= <NUMBER> (<WORD>)+ <NUMBER> <NUMBER> <NUMBER> <NUMBER> • Possiamo osservare che: • il database ha una sua descrizione • ogni categoria è caratterizzata da un codice numerico e un nome • ogni alimento è caratterizzato da un codice numerico, un nome e quattro valori numerici che si riferiscono ai tre nutrienti principali e all’energia fornita dall’alimento (questi valori si riferiscono, come è usuale in tutti i database alimentari e alle specifiche presenti anche sui prodotti che comunemente comperiamo a supermercato, a 100 g di prodotto)
Grammatica Database (2) • <ADiet> ::= <Database> | <User> <Diet> • <Database> ::= database (<WORD>)+ (<Category>)+ • <Category> ::= category<NUMBER> (<WORD>)+ (<FoodCategory>)+ • <FoodCategory> ::= <NUMBER> (<WORD>)+ <NUMBER> <NUMBER> <NUMBER> <NUMBER> • Esempio: database INRAN category 01 Cereali e Derivati 960 Biscotti alla soia 11.5 6.1 70.8 366 descrizione codice nome codice nome proteine lipidi (grassi) carboidrati energia
Grammatica Dieta (1) • <ADiet> ::= <Database> | <User> <Diet> • <User> ::= user (<WORD>)+<NUMBER>/<NUMBER>/<NUMBER><WORD> <NUMBER> kg <NUMBER> cm<NUMBER> • <Diet> ::= diet (<Week>)+ • <Week> ::= week (<Day>)+ • <Day> ::= day (<Meal>)+ • <Meal> ::= (<WORD>)+ <NUMBER> : <NUMBER> (<FoodDiet>)+ • <FoodDiet> ::= <NUMBER> <NUMBER> g • Possiamo osservare che: • la dieta viene preceduta dai dati riguardanti l’utente (nome, data di nascita, sesso, peso, altezza, stile di vita) • Ogni pasto è caratterizzato da un nome e un orario • Ogni alimento è caratterizzato da due valori numerici, un codice (con il quale si possono recuperare informazioni sull’alimento nel database) e la quantità (in grammi).
Grammatica Dieta (2) • <ADiet> ::= <Database> | <User> <Diet> • <User> ::= user (<WORD>)+<NUMBER>/<NUMBER>/<NUMBER><WORD> <NUMBER> kg <NUMBER> cm<NUMBER> • Esempio: user Paolo Grassi 20/08/1986 m 61 kg 174 cm 1 nome utente data di nascita sesso peso altezza stile di vita
Grammatica Dieta (3) • <ADiet> ::= <Database> | <User> <Diet> • <Diet> ::= diet (<Week>)+ • <Week> ::= week (<Day>)+ • <Day> ::= day (<Meal>)+ • <Meal> ::= (<WORD>)+ <NUMBER> : <NUMBER> (<FoodDiet>)+ • <FoodDiet> ::= <NUMBER> <NUMBER> g • Esempio:diet week day Colazione 8:00 135020 125 g nome pasto orario codice alimento quantità
Grammatica: osservazioni • Come accennato in precedenza, i token sono stati minimizzati ai soli <NUMBER> e <WORD> per una scelta progettuale: • Questo progetto è stato più volte modificato cercando di dare una più ampia configurazione all’utente finale: • Non c’è vincolo sul nome della categoria del database • Non c’è vincolo sul nome del pasto • Facilità d’integrazione di altre lingue • Scelta tra Domenica o Lunedì come primo giorno della settimana • Gestione del calcolo delle calorie (stile di vita)
Proprietà della grammatica • La grammatica è di Tipo 2 (context-free) secondo la classificazione di Chomsky, in quanto tutte le produzioni risultano essere nella forma: • Il linguaggio generato risulta essere di Tipo 3 (regolare) poiché la grammatica non contiene self-embedding.
Riconoscitore • L’unica produzione alternativa presente nella grammatica è: e i relativi Starter Symbols sono: • Da sui possiamo assumere che la grammatica è LL(1): • Infatti, non solo la condizione necessaria affinché la grammatica sia LL(1) è verificata ma, poiché nessuno dei metasimboli può generare la stringa vuota, tale condizione è anche sufficiente e non si necessita di calcolare i DirectorSymbols. • Poiché la grammatica è LL(1): • Le frasi vengono analizzate Left-to-Right applicando la leftmostderivation (derivazione canonica sinistra) e basta un solo simbolo della frase per scegliere con certezza la produzione opportuna;
Strumenti utilizzati • JavaCC 5.0 • Genera automaticamente, a partire dalla grammatica: • Il parser; • Il lexer (scanner) per il riconoscimento dei token; • Le classi per lanciare eventuali errori lessicali e\o sintattici; • JTB 1.4.3 • Genera le classi necessarie a creare l’albero sintattico AST (una classe per ogni produzione della grammatica); • Implementa Visitor che operano depth-first; • Eclipse 3.6.1
Struttura Finale (1) • Partendo dai due Package creati: database user Database Category FoodCategory DayDiet Diet FoodDiet Mean User WeekDiet
Struttura Finale (2) visitor gui syntaxtree parser user database services exception Per gestire gli errori semantici come delle eccezioni DietVisitor TreeVisitor ControlVisitor EditorFrame DietFrame Fornisce metodi per le operazioni sui file .txt e .xml
Struttura Finale – Parser • Il package “parser” contiene le classi relative al Lexer, al Parser ed alle eccezioni sintattiche • Parser: • Realizzato da JavaCC; • Rapporto Client/Server col Lexer; • Restituisce l’albero generato, in modo che i vari visitor possano visitarlo ed interpretarlo. • Il package “syntaxtree”contiene le classi che rappresentano i nodi dell’albero, in particolare una per ogni metasimbolo della grammatica. syntaxtree parser
Struttura Finale (2) visitor gui syntaxtree parser user database services exception DietVisitor TreeVisitor ControlVisitor EditorFrame DietFrame
Struttura Finale – Visitor • La classe DepthFirstVisitor, generata da JTB, è stata estesa da tre sottoclassi: • ControlVisitor • visita l’APT e viene lanciato per primo poiché verifica la correttezza semantica, gestendo gli errori semantici come eccezioni; • TreeVisitor • visita l’APT e ne fornisce una rappresentazione grafica sotto forma di albero (la quale verrà passata all’interfaccia grafica EditorFrame.java); • DietVisitor • visita l’APT e fornisce tutte le statistiche necessarie per analizzare la dieta alimentare inserita (le quali verranno passate al’interfaccia grafica DietFrame.java) visitor DietVisitor TreeVisitor ControlVisitor
Controllo Semantico • Il visitor ControlVisitor, a partire dall’APT, verifica la correttezza semantica: • infatti la sola correttezza sintattica non è sufficiente affinché la dieta o il database alimentare inserito possano essere considerati corretti: • Ma quali sono le regole semantiche?
Regole Semantiche – Database (1) Non si possono avere due o più categorie con lo stesso codice
Regole Semantiche – Database (2) Non si possono avere due o più categorie con lo stesso nome
Regole Semantiche – Database (3) Non si possono avere due o più alimenti con lo stesso codice
Regole Semantiche – Dieta (1) La dieta può essere composta da un minimo di 1 ad una massimo di 52 settimana
Regole Semantiche – Dieta (2) Ogni settimana è composta da 7 giorni e l’ordine dei giorni va rispettato
Regole Semantiche – Dieta (3) Ogni giorno può contenere da un minimo di un pasto ad un massimo di 7 pasti
Regole Semantiche – Dieta (4) Non si può avere in un giorno due o più pasti con lo stesso orario.
Regole Semantiche – Dieta (5) Non si può avere in un pasto due o più alimenti con lo stesso codice.
Struttura Finale (2) visitor gui syntaxtree parser user database services exception DietVisitor TreeVisitor ControlVisitor EditorFrame DietFrame
Interfaccia Grafica – EditorFrame • EditorFrame gui EditorFrame DietFrame
Interfaccia Grafica – EditorFrame • EditorFrame (Database) Linguaggio da analizzare Esito dell’analisi lessicale, sintattica e semantica. (ControlVisitor) Rappresentazione grafica sotto forma d’albero del linguaggio analizzato (TreeVisitor)
Interfaccia Grafica – EditorFrame • EditorFrame (Dieta)
Interfaccia Grafica – DietFrame • DietFrame
Note sul Progetto (1) • Nato da un’idea di oramai quasi due anni fa, in questo lasso di tempo è stato più volte riprogettato ripartendo proprio dalla grammatica: • per quanto riguarda le regole del database, essendo quest’ultimo ben strutturato e definito, non ha ricevuto modifiche sostanziali • la parte invece dedicata alla descrizione dell’utente e della dieta è stata più volte modificata per • cercare di rendere il linguaggio più familiare e più facilmente utilizzabile da un ipotetico utente finale e per far fronte alla facile possibilità • rendere la grammatica resistente alle diverse idee in ambito dietistico. • L’ultimo stadio di questa evoluzione ha portato all’eliminazione di tutti i token specifici (come <DAY>, <MEANS>, <LIFESTYLE>, <SEX>, …) proprio per alleggerire la grammatica e darle maggiore elasticità; • Questo però ha portato ad un maggior controllo semantico da parte di ControlVisitor (la maggior parte dei valori utilizzati per effettuare i controlli sono inseriti nel file Conf.java).
Note sul Progetto (2) • Oltre alla visualizzazione grafica data dall’interfaccia DietFrame, la dieta, con i relativi grafici delle statistiche, può essere visualizzata anche mediante web browser: • prima viene salvata in un file xml • poi trasformata mediante foglio di stile xslt • e infine avviene la validazione del documento (XSD) • È presente anche lo strumento di Log.
Collaudo • Per il collaudo del sistema sono stati scritti alcuni significativi file di codice per verificare: • la creazione corretta dell’albero sia per il database sia per la dieta • Segnalazione di errori sintattici • Segnalazione di errori semantici • Corretta visualizzazione del database e della dieta
Sviluppi futuri • Creare un’interfaccia per la configurazione del sistema; • Migliorare le statistiche utilizzando equazioni, riguardanti la dieta alimentare, più complesse e complete; • Inserire la gestione di più nutrienti (non solo proteine, lipidi e carboidrati); • Aumentare la gestione dei dati utente.
Collaudo Database • FoodAlreadyInDatabase • Inserimento di un alimento già presente nel database • CategoryNameAlreadyInDatabase • Inserimento di una categoria con un nome già presente nel database • CategoryCodeAlreadyInDatabase • Inserimento di una categoria con un codice già presente nel database
Collaudo Utente • IncorrectDate • Inserimento di una data non corretta • IncorrectSex • Inserimento di un carattere o parola non corretta per il sesso • IncorrectWeight • Inserimento per il peso di un valore non corretto • IncorrectHeight • Inserimento per l’altezza di un valore non corretto • IncorrectLifestyle • Inserimento per lo stile di vita di una parola non corretta
Collaudo Dieta • DatabaseNotLoaded • Inserimento di una dieta alimentare senza la presenza di un database • IncorrectWeek • Inserimento di una settimana non composta di 7 giorni nella dieta • WeekAlreadyComplete • Inserimento di un giorno in una settimana già composta da 7 giorni • IncorrectTime • Inserimento di un pasto con un orario errato • MeanAlreadyInDay • Inserimento di un pasto con un orario già presente nel giorno di dieta
Collaudo Dieta • FoodNotInDatabase • Inserimento di un alimento non presente nel database • FoodAlreadyInMean • Inserimento di un alimento con codice già presente nel pasto • NumberOfWeeksInDiet • Inserimento di una settimana in una dieta già completa • NumberOfMeansInDay • Inserimento di un pasto in un giorno già completo • NumberOfFoodsInMean • Inserimento di un alimento in un pasto già completo