La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Linguaggi e Modelli Computazionali LS Anno Accademico 2007/2008 Alessio Della Motta Un linguaggio per descrivere partite di Maraffone: il gioco più popolare.

Presentazioni simili


Presentazione sul tema: "Linguaggi e Modelli Computazionali LS Anno Accademico 2007/2008 Alessio Della Motta Un linguaggio per descrivere partite di Maraffone: il gioco più popolare."— Transcript della presentazione:

1 Linguaggi e Modelli Computazionali LS Anno Accademico 2007/2008 Alessio Della Motta Un linguaggio per descrivere partite di Maraffone: il gioco più popolare in Romagna!

2 Sviluppare un semplice linguaggio che permetta la descrizione dello svolgimento di una partita di Maraffone, un gioco di carte molto diffuso in Romagna. Realizzare un valutatore o interprete in grado di calcolare i punteggi parziali e complessivi della partita, controllando al contempo il corretto svolgimento delle diverse fasi e dei turni di gioco.

3

4 G = VT Insieme dei simboli terminali o token. VN Insieme dei simboli non-terminali. P Insieme delle produzioni della grammatica. S Scopo della grammatica.

5 Le produzioni della grammatica sono nella forma: A ::= α, A Є VN, α Є (VT U VN)*. La grammatica è di Tipo 2 (context-free) secondo la classificazione di Chomsky. La grammatica non contiene Self-Embedding, perciò il linguaggio generato sarà di Tipo 3 (regolare). LL(1), così da garantire il determinismo dell’analisi ricorsiva discendente.

6 | "0"> ( )*> ( | )*> Tokens per nomi e numeri: Tokens per carte e dichiarazioni:

7 Scopo S della grammatica: Scope ::= "MARAFFONE" "{" Coppie Soglia ( Partita )+ "}" Il linguaggio deve contenere forzatamente le indicazioni delle squadre, della soglia ed una o più partite. Questa scelta è dovuta al fatto che non esiste un Maraffone senza due squadre ed almeno una partita. Descrizione delle coppie, della soglia e delle partite: Coppie ::= "COPPIE:" "&" "," "&" "." Soglia ::= "SOGLIA:" "." Partita ::= "PARTITA" "{" DistribuzioneCarte Briscola Mani "}" Per quanto riguarda le parentesi graffe, non vi è self-embedding: una sola parentesi iniziale ed una sola finale in entrambi i casi. Nessun livello di nesting di cui tenere conto.

8 Distribuzione delle carte ai giocatori: DistribuzioneCarte ::= "DISTRIBUZIONE CARTE:" Consegna ";" Consegna ";" Consegna ";" Consegna "." Consegna ::= "RICEVE" ListaCarteRicevute ListaCarteRicevute ::= CartaRomagnola "," CartaRomagnola "," CartaRomagnola "," CartaRomagnola "," CartaRomagnola "," CartaRomagnola "," CartaRomagnola Decisione della briscola: Briscola ::= "BRISCOLA DECISA DA" "A" "." Ogni giocatore deve ricevere esattamente 10 carte, non una di più e non una di meno...

10 La grammatica può non essere elegante in alcuni suoi punti, ad esempio la produzione: Mani → Mano Mano... Mano. – Possibile alternativa: Mani → (Mano)+ In questo caso, però, la struttura sintattica del linguaggio si correla direttamente ad un requisito semantico ben preciso (ovvero il fatto che occorrano dieci mani per fare una partita). Per questo motivo si è deciso di specificare dieci volte il non-terminale Mano, rendendo così sintatticamente errate frasi che descrivano partite con un numero di mani diverso da dieci. Non sono presenti ε-rules e si verifica facilmente come gli starter-set siano disgiunti, rendendo così la grammatica LL(1).

11 Linguaggio: Java (jdk1.6.0_03). Ambiente di sviluppo: NetBeans IDE 6.0. Generazione automatica parser: JavaCC 4.0. Generazione classi che rappresentano l’albero sintattico ed implementazione di Visitor generici che effettuano la visita depth-first: Java Tree Builder

12 Il package Parser è stato generato in automatico da JavaCC; i package Visitor e SyntaxTree sono stati generati da JTB; il package GUI è stato parzialmente implementato da NetBeans IDE.

13

14 Classe CircularList generica che estende la classe Vector e implementa le funzionalità di una coda circolare. Sarà utile al gestore dei turni (vedi dopo). Enumerativi Seme e ValoreCarta per descrivere una carta, che sarà rappresentata dall’omonima classe Carta. Un’eccezione apposita MaraffoneException scatenata da errori semantici che possono avvenire durante la valutazione.

15

16 Un giocatore è rappresentato da un’istanza della classe Giocatore, al quale durante un Maraffone saranno assegnate diverse mandate di carte (una per ogni partita) rappresentate anch’esse dall’apposita classe Mandata. Una Squadra è composta da due giocatori e mantiene un certo insieme di carte che saranno quelle accumulate durante una specifica partita. L’ambiente di gioco è rappresentato dalla classe Tavolo, tramite la quale sarà possibile svolgere tutte le azioni semantiche necessarie: ad esempio la giocata di una carta da parte di un giocatore, la dichiarazione della briscola, la presa di una squadra e così via. La classe Tavolo contiene un GestoreTurno al quale è delegato il compito di gestire il corretto ordine di gioco dei giocatori.

17 MaraffoneVisitor: – Percorre l’albero ed istanzia tutti gli oggetti necessari (giocatori, squadre, ecc.), tra cui un Tavolo che rappresenterà l’ambiente di gioco. Tramite questo si eseguiranno tutte le operazioni di gioco, facendo i necessari controlli semantici, e si otterranno i risultati parziali e complessivi del Maraffone. MaraffoneTreeVisitor: – Costruisce una struttura a TreeNode atta a rappresentare l’albero sintattico. Non vengono fatti controlli semantici, quindi se un testo è conforme alla sintassi del linguaggio e non alla semantica del gioco, l’albero verrà generato ugualmente. Sono stati implementati due visitor per ottenere due distinte interpretazioni:

18 Risultato della visita del visitor MaraffoneVisitor Risultato della visita del visitor MaraffoneTreeVisitor

19 Alcuni test utilizzando JUnit. – Ad esempio per testare il funzionamento della classe CircularList. Un maggior numero di Test operativi tramite esempi costruiti ad-hoc, in modo da osservare se il linguaggio gestiva correttamente le varie tipologie di situazioni anomale.

20 Non sono state implementate esattamente tutte le regole, come ad esempio l’obbligo ci chiamare la briscola o la possibilità di chiamarsi fuori. Non ci sono controlli sulla veridicità delle dichiarazioni del primo giocatore di una mano, anche se ciò non è strettamente necessario in quanto un giocatore può bluffare. Linguaggio verboso; sarebbero utili tool di generazione automatica (possibilmente in modo grafico) di testi del linguaggio. Implementazione del gioco via rete, ad esempio tramite quattro client ed un server centrale che, mano a mano che il gioco avanza, compila un testo del linguaggio e genera i risultati alla fine della partita.


Scaricare ppt "Linguaggi e Modelli Computazionali LS Anno Accademico 2007/2008 Alessio Della Motta Un linguaggio per descrivere partite di Maraffone: il gioco più popolare."

Presentazioni simili


Annunci Google