250 likes | 383 Views
CAKE Ambiente per la scrittura e la riproduzione audio di ricette per torte. Linguaggi e Modelli Computazionali LS. Elisabetta Visciotti. Obiettivi. Creare un ambiente che permetta la scrittura di ricette di torte
E N D
CAKEAmbiente per la scrittura e la riproduzione audio di ricette per torte Linguaggi e Modelli Computazionali LS Elisabetta Visciotti
Obiettivi • Creare un ambiente che permetta la scrittura di ricette di torte • Realizzare una grammatica che ci permetta di definire senza ambiguità, mediante delle notazioni formali, le frasi del linguaggio che vogliamo generare. • Il linguaggio deve essere: • comprensibile • di facile utilizzo per ogni tipologia di utente • Sviluppare l’interprete: • che accetti in ingresso una stringa di caratteri, riconosca se la stringa è una frase del linguaggio (analisi sintattica), in caso positivo esegua l’analisi semantica. • Riprodurre in formato audio la ricetta inserita: • utilizzando un sintetizzatore vocale
Grammatica (1/4) <Recipe>::=Information<Information>Ingredients<Ingredients>Preparation<Preparation><EOF> Scope <Information>::= <Name>;<Makes>;<Difficulty>; <Ingredients>::= (<Ingredient>;)+ <Preparation>:: = <Mix>;(<Add>;)*<Transfer>;<Bake>;[<Fill>;][<Decorate>;] Struttura ricetta
Grammatica (2/4) <Ingredient>::= Ingredient(<Quantity>,<Element>) <Quantity>::= grams <Num> | <Num> • <Name>::= Name(<ComplexString>) • <Makes>::= Makes(<Num>) • <Difficulty>::= Difficulty(<Level>) • <Level>::= easy | medium | hard Informazioni torta Ingredienti torta
Grammatica (3/4) <Mix>::= Mix(<Element> {,<Element>}) <Add>::= Add(<Element> {,<Element>}) <Transfer>::= Transfer(<CakePan>) <Bake>::= Bake(<Cooking>) <Fill>::= Fill(<Element> {,<Element>}) <Decorate>::= Decorate(<Element> {,<Element>}) <CakePan>::= <Shape> cake pan <Cooking>::= <Temperature>,<Time> <Shape>::= round | rectangular | square <Temperature>::= <Num> centigrade <Time>::= <Num> minutes <Element>::= <ComplexString> Preparazione torta
Grammatica (4/4) <ComplexString>::= (<String>)+ <String: ([“A”-”Z”,”a”-”z”,”0”-”9”])+> Stringhe di input <Num: ([“1”-”9”]([“0”-”9”])* )> Numeri maggiori di zero
INFORMATION Name (Black Forest); Makes (8); Difficulty (medium); INGREDIENTS Ingredient (6,eggs); Ingredient (grams 250, sugar); Ingredient (grams 100, seed oil); Ingredient (grams 100, milk); Ingredient (grams 200, flour); Ingredient (grams 120, cocoa); Ingredient (grams 200, nutella); Ingredient (grams 250, whipped cream); Ingredient (grams 80, chocolate chips); Ingredient (1, sachet yeast); Ingredient (1, sachet vanillin); Esempio di ricetta(1/2) <Information>::= <Name>;<Makes>;<Difficulty>; <Ingredients>::= (<Ingredient>;)+
Esempio di ricetta(2/2) <Preparation>:: = <Mix>;(<Add>;)*<Transfer>;<Bake>;[<Fill>;][<Decorate>;] PREPARATION Mix (eggs, sugar); Add (seed oil, milk); Add (cocoa); Add (flour, sachet yeast); Add (sachet vanillin); Transfer (round cake pan); Bake (180 centigrade, 40 minutes); Fill (whipped cream, nutella); Decorate (whipped cream, chocolate chips); Qui Add è stato utilizzato più volte In questo esempio ci sono anche le parti opzionali come Fill e Decorate
Grammatica e Linguaggio (1/2) • Grammatica: la grammatica è di tipo 2 (context free) secondo la classificazione di Chomsky. Infatti ci sono produzioni vincolate alla forma: A → α con α є (VT U VN)* ed A є VN • Linguaggio: il linguaggio generato è di tipo 3 (linguaggio regolare) in quanto è possibile notare che la grammatica non presenta self-embedding, ovvero non prevede simboli non terminali autoinclusivi del tipo: A → β A δ dove A є VN e δ,β є V+
Grammatica e Linguaggio(2/2) • Lagrammaticaè priva di ε– rules. Il linguaggio quindi non prevede l’uso della stringa vuota, neanche a livello di scope, anche perché una ricetta vuota non avrebbe alcun senso. • Condizione necessaria e sufficienteaffinché una grammatica sia LL(1), poiché la grammatica è priva di ε– rules, è che per ogni metasimbolo, che appare alla sinistra di più produzioni, gli starter symbol corrispondenti alle parti destre delle produzioni alternative siano disgiunti. Si può dunque concludere che siamo in presenza di unaGRAMMATICA LL(1) • NOTA: Nel caso ci fosse stata la stringa vuota si sarebbe potuto ricorrere ad una tecnica di riscrittura in grado di eliminarla da tutte le produzioni, al più sarebbe comparsa solo nello scope (S ε, dove però S non compare nella parte destra di alcuna produzione).
Schema di funzionamento: Correttezza lessicale e Correttezza sintattica Sequenza di caratteri Analisi Sintattica: si verifica che una frase sia costruita secondo le regole grammaticali che descrivono il linguaggio Scanner Analisi Lessicale: vengono individuate le singole parole (token) di una frase Sequenza di token AST Parser Rappresentazione della frase
Visitor • La classe DepthFirstVisitor (generata da JTB) è stata estesa da due sottoclassi: • TreeVisitor: nel momento in cui si ha la correttezza sintattica e semantica, crea una rappresentazione sotto forma di albero della ricetta inserita • ReadVisitor: a seguito della correttezza sintattica e semantica, crea una rappresentazione testuale della ricetta che sarà poi utilizzata da un gestore grafico esterno per riprodurre sotto forma di audio la ricetta. Il gestore grafico si occupa di gestire il sintetizzatore vocale. Questa scelta permette di disaccoppiare il gestore grafico, realizzato come Singleton, dal visitor.
Schema di funzionamento: Correttezza semantica TreeVisitor AST Rappresentazione testuale ReadVisitor
Semantica Semantica: • Information: • Il numero di porzioni deve essere compreso nel range di valori: 2 - 20 • Ingredients: • Ogni ingrediente inserito non deve superare i 3000 grammi • Preparation: • La temperatura del forno deve essere compresa nel range: 100 - 250 gradi • Il tempo di cottura è compreso fra i 20 e 120 minuti
Strumenti utilizzati • Linguaggio di programmazione: Java jdk 1.6.0_16 • Ambiente di sviluppo: Eclipse Galileo • Implementazione Java Speech: FreeTTS versione 1.2.1 • Generazione del parser e dello scanner: JavaCC 4.2 • Generazione automatica delle classi necessarie per creare l’APT (o AST) e implementazione di visitor che operano DepthFirst: JTB 1.3.2 • Generazione della documentazione: JJDoc
Architettura: Packages Add.java Bake.java CakePan.java … DepthFirstVisitor.java TreeVisitor.java ReadVisitor.java … CakeParser.java Token.java … syntaxtree: classi generate da JTB per la costruzione dell’AST visitor: classi generate da JTB e visitor creati su estensione della classe DepthFirstVisitor parser: classi relative allo scanner e al parser generate da JavaCC gui: classi grafiche cake: classi per l’elaborazione utility: classi di appoggio CakeFrame.java CakePanel.java TreePanel.java … Manager.java CakeRecipe.java … TxtFileReader.java TxtFilter.java …
Classi generate da JavaCC Lexer: contiene il metodo getNextToken(), il quale implementa l’ASF deterministico che riconosce i token descritti dalle espressioni regolari Parser: chiama il lexer ogni volta che necessita del prossimo token. Contiene un metodo per ogni simbolo non terminale presente nella specifica della grammatica Ognichiamata al metodo getNextToken() restituisce un oggetto di questa classe
Classi Visitor Automaticamente generato da JTB Pattern visitor: Ciascun visitor realizza una visita di tipo depth-first avvalendosi del meccanismo double dispatch. I visitor hanno un metodo visit per ogni classe rappresentante un nodo dell’ APT (risultante dall’analisi intermedia del Parser). Le classi visitate accetteranno la visita richiamando il metodo visit con argomentio “this”.
Interfaccia Grafica (1/4) Form necessaria per inserire le informazioni riguardanti la torta Al momento della pressione del tasto OK si verifica l’inserimento dei dati nei vari campi Insert bar: permette all’utente di introdurre le informazioni generali della torta, la lista degli ingredienti e il procedimento
Interfaccia Grafica (2/4) Form necessaria per inserire gli ingredienti Al momento della pressione del tasto OK o NEXT si verifica l’inserimento dei dati nei vari campi
Interfaccia Grafica (3/4) Form necessaria per inserire il procedimento Al momento della pressione del tasto OK si verifica l’inserimento dei dati nei vari campi
Interfaccia Grafica (4/4) L’utente può così ascoltare la ricetta inserita
Test • Sono stati eseguiti diversi test al fine di verificare la correttezza del progetto: • Inserimento di frasi non corrette sintatticamente: • Makes (0); il parser risponde con un messaggio di errore indicando la riga e la colonna in cui è presente l’errore, infatti sintatticamente è sbagliata poiché i numeri devono essere tutti maggiori di zero. • Ingredient (gram 200, flour); il parser risponde con un messaggio di errore poiché si aspetta grams e non gram. • Inserimento di frasi corrette sintatticamente ma non semanticamente: • Makes (25); il parser fa il check della frase e dice che va tutto bene sintatticamente ma nel momento in cui si attiva uno dei due visitor abbiamo un errore: il numero di porzioni non rientra nel range prestabilito. • Ingredient (grams 4500, flour); semanticamente sbagliata, supera il limite massimo consentito per la quantità. • Sono stati effettuati anche diversi test per quanto riguarda l’interfaccia grafica affinchè si riesca a far fronte ad eventuali errori dell’utente.
Sviluppi futuri • Poter inserire non solo ricette di torte ma ricette di dolci in generale • Poter inserire più ricette contemporaneamente • Memorizzare la voce del sintetizzare in modo da creare un piccolo archivio di file audio • E tanto altro ancora…