160 likes | 327 Views
Corso di Linguaggi e Modelli Computazionali Prof. Enrico Denti. Sistema software per la programmazione di allarmi e promemoria. Progetto d on’t yo u f orget. Obiettivi. Elaborare un linguaggio intuitivo per la scrittura di promemoria.
E N D
Corso di Linguaggi e Modelli Computazionali Prof. Enrico Denti Sistema software per la programmazione di allarmi e promemoria Progetto don’t youforget Progetto DUF - Marco Albertin
Obiettivi • Elaborare un linguaggio intuitivo per la scrittura di promemoria. • Realizzare un interprete estendibile che fornisca anche un semplice supporto per la gestione degli errori. • Progettare una semplice interfaccia grafica per la scrittura e gestione dei promemoria. Progetto DUF - Marco Albertin
Analisi del problema • Scomposizione del programma in moduli: • Interprete. • Interfaccia grafica. • Componente di mediazione tra i due ambiti. • L’interprete necessita di una funzione di valutazione (come valutare un promemoria?). • Necessità di salvare i promemoria su filesystem. Progetto DUF - Marco Albertin
Grammatica in BNF (1/4) • S ::= <COMMANDS> | ε • La stringa vuota è teoricamente accettata dal riconoscitore, ma non dal valutatore (semantica nulla). • Le frasi sono costituite da una serie di comandi (infinite frasi possibili). • L’ordine di comandi diversi tra loro è ininfluente. • Il linguaggio è case-sensitive. Progetto DUF - Marco Albertin
Comandi principali Grammatica in BNF (2/4) <COMMANDS> ::= <COMMAND> , <COMMANDS> | <COMMAND> <COMMAND> ::= when(<DATE>) | hour(<HOUR>) | minute(<SIXTIETHS>) | second(<SIXTIETHS>) | context(<TYPE>) | alertType(<ALERT>) | text(‘<TEXT>’) | repeat(<NUM>,<ARGUMENTLIST>) <DATE> ::= <DAY>-<MONTH>-<YEAR> | <DAY>/<MONTH>/<YEAR> <TYPE> ::= generic | birthday | anniversary | call | meeting | party | diploma <ALERT> ::= none | discreet | average | maximum | red | lifeordeath <ARGUMENTSLIST> ::= [<ARGUMENTS>] | [] <ARGUMENTS> ::= <ARGUMENT> , <ARGUMENTS> | <ARGUMENT> <ARGUMENT> ::= yearDelay(<DIGIT>) | dayDelay(<DDAY>) | hourDelay(<DHOUR>) | minuteDelay(<DSIXTIETHS>) | increasing_priority | relaxing_priority | static_priority Formati di data “Enumerativi” Sottocomandi di repeat Progetto DUF - Marco Albertin
Grammatica in BNF (3/4) Da 1980 a 2099 Da 1 a 12 Da 1 a 31 <YEAR> ::= 198 <DIGIT> | 199 <DIGIT> | 20 <DIGIT> <DIGIT> <MONTH> ::= <NOT_ZERO> | 10 | 11 | 12 <DAY> ::= <NOT_ZERO> | 1 <DIGIT> | 2 <DIGIT> | 30 | 31 <HOUR> ::= <DIGIT> | 1 <DIGIT> | 20 | 21 | 22 | 23 <SIXTIETHS> ::= <DIGIT> | <ONE_TO_FIVE> <DIGIT> <DDAY> ::= <NOT_ZERO> | <NOT_ZERO> <DIGIT> | 1 <DIGIT> <DIGIT> | 2 <DIGIT> <DIGIT> | 3 <ZERO_TO_SIX> <ZERO_TO_FOUR> <DHOUR> ::= <NOT_ZERO> | 1 <DIGIT> | 20 | 21 | 22 | 23 <DSIXTIETHS> ::= <NOT_ZERO> | <ONE_TO_FIVE> <DIGIT> <NUM> ::= <NOT_ZERO> | <NOT_ZERO> <DIGIT> <ONE_TO_FIVE> ::= 1 | 2 | 3 | 4 | 5 <ZERO_TO_SIX> ::= <ZERO_TO_FOUR> | 5 | 6 <ZERO_TO_FOUR> ::= 0 | 1 | 2 | 3 | 4 <NOT_ZERO> ::= <ONE_TO_FIVE> | 6 | 7 | 8 | 9 <DIGIT> ::= 0 | <NOT_ZERO> Da 0 a 23 Da 0 a 59 Da 1 a 364 Da 1 a 23 Da 1 a 59 Da 1 a 99 Progetto DUF - Marco Albertin
Grammatica in BNF (4/4) <TEXT> ::= <CHAR> <TEXT> | ε <CHAR> ::= a | … | z | A | … | Z | <DIGIT> | … Tutti i caratteri sono ammessi eccetto l’apostrofo singolo (serve a delimitare la stringa) Progetto DUF - Marco Albertin
Considerazioni • Il linguaggio è di tipo 3 secondo la classificazione di Chomsky. • Grammatica di tipo LL(1). • Formalismo del riconoscitore: ASF. Progetto DUF - Marco Albertin
Scelte progettuali • Progettazione di un sistema ibrido. • Scrittura dell’interprete tramite il linguaggio Prolog: • Non è necessario costruire uno scanner ad hoc. • Programmazione più veloce ed ottimizzata. • Possibilità di introdurre non determinismo a costo implementativo nullo. • Realizzazione dell’interfaccia grafica in C#.NET. • Utilizzo di tuProlog come libreria di interfacciamento. • Possibilità di creare direttamente un oggetto C# dalla valutazione del linguaggio. Progetto DUF - Marco Albertin
Scelte progettuali • Necessità: rendere possibile la creazione e la gestione di più configurazioni di promemoria (Agenda) persistenti. • Soluzione: utilizzare file scritti in XML per memorizzare questo tipo di collezioni. • Costruzione di metodi che trasformano i promemoria in XML e viceversa. • Utilizzo di strumenti automatici forniti dal linguaggio per la scrittura di file XML. Progetto DUF - Marco Albertin
Funzionamento Ambiente .NET Interprete Prolog Intermediario tuProlog Interfaccia grafica Scrittura del programma Preparazione goal Valutazione del programma Recupero dell’oggetto promemoria Visualizzazione / esecuzione promemoria Ambiente Prolog Progetto DUF - Marco Albertin
Estensione dell’interprete • Il linguaggio Prolog ammette asserzioni dinamiche. • Realizzazione di un blocco per la scrittura di produzioni personalizzate: • #assert … #endassert • All’interno del blocco vige la grammatica Prolog • Riscrittura del programma in forma di goal Prolog aggiungendo la lista per le asserzioni dinamiche. Progetto DUF - Marco Albertin
Gestione degli errori • Il programma Prolog in caso di fallimento nel riconoscimento o nella valutazione risponderebbe: no. • Introduzione della variabile Error nella testa di ogni clausola contenente una stringa di errore. • La stringa viene riempita nel punto in cui si verifica il fallimento -> è possibile sapere il punto del programma che ha causato errori. Progetto DUF - Marco Albertin
Limiti • L’estensione dell’interprete presuppone la conoscenza del linguaggio Prolog e del funzionamento dell’interprete statico. • La creazione di oggetti C# tramite Prolog lega fortemente i due ambiti applicativi e ne riduce la flessibilità. • Forte presenza di strutture imperative all’interno del programma Prolog -> leggibilità scarsa. Progetto DUF - Marco Albertin
Sviluppi futuri • Creazione di uno schema XSD per la validazione dei file di Agenda. • Realizzazione di un file XSLT per rendere i file di Agenda visualizzabili dal Web. • Svincolare la parte di valutazione del linguaggio dal programma Prolog impostandola dinamicamente dall’intermediario. • Creare un Web Service per la creazione di promemoria da remoto. Progetto DUF - Marco Albertin
And then… …have a DUF!! Progetto DUF - Marco Albertin