230 likes | 332 Views
File Name Manager. Progetto di Linguaggi e Modelli Computazionali LS di Tomaiuoli Giuseppe mat 0196947. Visione.
E N D
File Name Manager Progetto di Linguaggi e Modelli Computazionali LS di Tomaiuoli Giuseppe mat 0196947
Visione A tutti noi è capitato negli ultimi anni, dopo una vacanza o dopo una festa o dopo un qualsiasi evento di avere una quantità di foto spaventosa, in formato digitale, con nomi assurdi, dovuti al setup della fotocamera digitale e di doverli quindi modificare uno per uno, magari scrivendo il nome dell’evento e spesso anche numerandole. Perché non inventarsi un linguaggio specifico che consenta di fare questo in modo rapido ed indolore?
Desiderio • Aggiungi a tutti i file “sanSiro” • Cambia “DWC” con “compleanno” • Aggiungi codice numerico di 5 cifre a partire da 11. (Es. 00011, 00012 ecc…). • Togli “SonyDigitalCamera” da tutti i file.. • ……….. • ………..
Grammatica (versione 1) • <Program> ::= <Modify> • <Modify> ::= Change<Old><New> | Less<Old> | Add<New><Where> • <Old> ::= StringChars • <New> ::= <Old> | Hm Code • <Where> ::= Pre | Post
Grammatica terminali (versione 1) Perché le “|”? Perché {Printable} comprende anche i bianchi • Change = [C] • Less = [L] • Add = [A] • StringChars = '|'{PrintableNot}+'|' • Pre =[H] • Post =[T] • Hm= [123456789] • {PrintableNot}={Printable} -["\/:*?<>|] • Code = 0{Digit}+ Caratteri non accettati nei nomi dei file da Windows Perché “0” ? Hm≠Code
Semantica • Add aggiunge una stringa o un codice al nome del file come prefisso o suffisso (Pre o Post) definito da Where • Change modifica il nome del file sostituendo la parte “Old” con la parte “New” • Less toglie la parte “Old” dal nome del file • New è la parte da aggiungere, può essere una stringa o un codice numerico • Code è il codice formato da “Hm” cifre (es. 4 in 5 cifre = 00004)
Realizzazione And the Winner is…. • Da linea di comando (poco “user friendly” è antipatico come il DOS… agli utenti “normali”) • Console Grafica (molto gradita ai più, vedi successo di “Windows”) • Comandi Vocali (molto comodo da utilizzare, un po’ complicato da settare, difficoltà per DWC) • Altro…… (visto l’ambito di questo progetto non è il caso di addentrarsi in implementazioni particolarmente sofisticate)
Scelte Progettuali e Strumenti 1 • Linguaggio di Programmazione: JAVA • Strumento di sviluppo IDE : NetBeans • Strumento di sviluppo UML: JUDE • Scanner e Parser sono gratis con quasi tutti gli strumenti • GoldParser Builder consente: • separare la grammatica (EBNF) • parsing table • testare nel framework • implementare il Parser in diversi Linguaggi • Maggiore potenza in quanto è LALR • Interprete: GoldParser Engine
Scelte Progettuali e Strumenti 2 • JavaCC consente: • Di sviluppare scanner e parser a partire dal file della grammatica .jj • non consente di testare la grammatica • JTB abbinato a JavaCC consente: • Di creare l’albero sintattico astratto APT • Modificare la semantica senza modificare il file della grammatica • Implementare facilmente il pattern Visitor
Scelte Progettuali e Strumenti 3 Quindi?: • Essendo la grammatica LL(1) non è necessario sfruttare la maggiore potenza di GP che è LALR • Una volta testata la grammatica con GP si sviluppano parser e scanner e APT con JTB & JavaCC
Definizione della Grammatica per JavaCC e JTB void Input() :{ } { modifica() <EOF> } void modifica():{ } { <CHANGE> <OLD> nuova() | <LESS> <OLD> | <ADD> nuova() where() } void nuova():{ } { <OLD> |<HM> <CODE> } void where():{} { <PRE> |<POST> }
Grammatica - Terminali Espressioni Regolari TOKEN:{<CHANGE:"C">} TOKEN:{<ADD:"A">} TOKEN:{<LESS:"L">} TOKEN:{<PRE:"H">} TOKEN:{<POST:"T">} TOKEN:{<HM:["1"-"9"]>} TOKEN:{<CODE:"0"(["0"-"9"])+>} TOKEN:{<OLD:"|"["$","0"-"9","A"-"Z","_","a"-"z","!"," ","-","+", "£","%","&","(",")","[","]","{","}","^",",",".", ";","ò","à","ç","°","ù","§","è","é","ì","'"] (["$","0"-"9","A"-"Z","_","a"-"z","!"," ","-","+", "£","%","&","(",")","[","]","{","}","^",",",".", ";","ò","à","ç","°","ù","§","è","é","ì","'"])*"|">}
Linguaggio • Frasi Lecite: • C |stirnga| (|stringa| o numero di Cifre e Codice Iniziale) • C |pippo| |pluto| o C |pippo| 7 05 • L |stringa| • L |pluto| • A (|stringa| o numero di Cifre e Codice) dove (prefisso = H suffisso = T) • A |pippo| H o A 7 08 T • Proprietà del Linguaggio: • Generabile • Decidibile • Cardinalità infinita (stringhe e codice) • Non c’è la Stringa Vuota ε, non necessaria • Riconoscitore: ASF, RSF
Diagramma delle Classi Implementazione Pattern Visitor
Limiti e Sviluppi Futuri • Non è stata implementata la possibilità di riordinare i file in un modo differente dall’ordine alfabetico …. • Si possono aggiungere ulteriori TOKEN alla grammatica per gestire Date, Estensione dei File, ecc … • Sicuramente è migliorabile dal punto di vista della grafica, dell’efficienza e dei tempi di esecuzione • Si possono aggiungere funzionalità che tengano conto di caratteri “jolly” • La possibilità di salvare una copia diversa dei file con i nuovi nomi in altre locazioni invece di modificarne i nomi nella posizione corrente • Ecc …
Conclusioni Dato che non si voleva e doveva sviluppare un prodotto commerciale ma solo un prodotto che desse la possibilità di fare esperienza con gli strumenti e testare la preparazione sugli argomenti del corso si sono trascurate alcune delle parti precedentemente evidenziate. Magari in futuro si potranno migliorare e sviluppare al fine di ottenere un prodotto commerciale.