• Non ci sono risultati.

Come detto nel primo Capitolo, le grammatiche presentano diversi formalismi attraverso i quali è possibile esprimere le regole di derivazione. La grammatica del nuovo linguaggio è stata definita attraverso la metasintassi Backus-Naur Form (BNF). Di seguito le regole grammaticali del nuovo linguaggio e la sua descrizione.

Come già detto una grammatica G è una quadrupla G = {N, Σ, S, P}, dove N è un insieme finito di simboli che rappresentano categorie sintattiche o simboli non terminali, Σ è l'alfabeto, S è un simbolo di categoria sintattica indicato come iniziale o principale, appartenente a N e P è un insieme di regole di produzione.

Nell'insieme dei non terminali N del nuovo linguaggio troviamo tutte quelle categorie sintattiche che vogliamo definire, in particolar modo:

N = {Model, ClassDef, VarDef, BasicType, CompoundType, DistDef, MethodDef, Tuple, Expr, Com}

Vediamole nel dettaglio. Un modello è:

• una sequenza anche vuota di classi (ClassDef) , di variabili (VarDef ) o di distribuzioni (DistDef)

• eventualmente la parola chiave init seguita da un comando racchiuso tra graffe, • la parola chiave termination seguita da un espressione racchiusa tra graffe, • la parola chiave step seguita da una sequenza, eventualmente vuota, di comandi

racchiusi tra graffe.

Model ::= (ClassDef | VarDef | DistDef)* ['init' '{' Com '}']

Una definizione di variabile è:

• un tipo base (BasicType) seguito da un ID ed eventualmente un uguale e un'espressione (Expr) , il tutto seguito da un punto e virgola:

int x = 5; int x;

• oppure la parola chiave list seguita da un tipo base e un ID, un uguale e eventualmente una lista, anche vuota, di tuple seguite da una virgola, racchiusa tra graffe, il tutto seguito da un punto e virgola

list Giocatori G = {(7), (7), (7), (7)}; list Territori T = {};

• oppure la parola chiave graph seguita da un tipo base e un ID, un uguale e tra graffe eventualmente una lista di uno o più ID

• oppure la parola chiave edges seguita da un ID e un uguale e tra parentesi graffe una o più coppie di interi tra tonde

Un tipo base può essere: • un intero • un booleano • un double    VarDef ::= (BasicType ID ['=' Expr] |    'list' BasicType ID '=' '{' [(Tuple ',')* Tuple]'}') ';'|   'graph' BasicType ID '=' '{'[(ID',')*ID]'}' ';' |    'edges' ID '=' '{'('('<INTEGER_LITERAL> ',' <INTEGER_LITERAL> ')'    ',')*'('<INTEGER_LITERAL> ',' <INTEGER_LITERAL> ')' '}' ';'

• un ID

list Giocatore G = {};

in questo caso Giocatore è un tipo base.

Un tipo composto può essere: • un tipo base

• la parola chiave list seguita da un tipo base

Le tuple sono un'eventuale lista di espressioni e virgole racchiusa tra parentesi tonde.

Una classe è:

• la parola chiave class seguita da un ID (un nome identificativo scelto da chi implementa la classe) seguita da una lista, anche vuota, di variabili (VarDef) o di metodi (MethodDef), racchiusa tra graffe.

BasicType ::= 'int' | 'bool' | 'double' | ID

CompoundType ::= 'list' BasicType | BasicType

Una distribuzione è:

• la parola chiave distribution seguita da un ID seguita da un tipo base con un ID e un ID, divisi da una virgola e tra tonde, il tutto seguito da un'espressione tra graffe.

Una definizione di metodo è: o un tipo composto o la parola chiave void seguito da un ID e delle parentesi tonde al cui interno si trova un tipo base con un ID o una lista di tipi base con un ID, seguiti da una lista, anche vuota, di comandi tra graffe.

Un'espressione può essere sia:

• delle cifre numeriche (<INTEGER_LITERAL>) • un ID

• due ID con un punto nel mezzo e eventualmente un espressione o una lista di esse

• un'espressione più un'altra espressione • un'espressione meno un'altra espressione

MethodDef ::= (CompoundType | 'void') ID '('[BasicType ID',')*  BasicType ID]')' '{' Com* '}'

ClassDef ::= 'class' ID '{' (VarDef | MethodDef)* '}'

• un'espressione per un'altra espressione • un'espressione diviso un'altra espressione

• la parola chiave random con delle coppie di interi tra parentesi

• la parola chiave pick seguita da un'espressione una virgola e un ID tra parentesi tonde

• Un'espressione booleana seguita da un punto interrogativo, un'espressione, due punti e un'altra espressione

• la parola chiave filter con tra parentesi tonde un tipo base e un id e un id, seguiti da un'espressione booleana tra graffe

• il punto esclamativo seguito da un'espressione • il segno della sottrazione seguito da un'espressione

che un'espressione booleana – sarà poi compito di una successiva fase di compilazione effettuare il type checking per valutare di che tipo sono le espressioni:

• un'espressione seguito dal simbolo di maggiore, il singolo di minore o il simbolo di uguaglianza, seguiti da un'espressione;

• due espressioni booleane con nel mezzo un and o un or • le parole chiavi true o false

• la parola chiave forall seguita tra parentesi da un tipo base con un ID e un altro ID divisi da una virgola, seguiti da un'espressione booleana tra parentesi

• la parola chiave exists seguita tra parentesi da un tipo base con un ID e un altro ID divisi da una virgola, seguiti da un'espressione booleana tra parentesi

Un comando può essere:

• eventualmente un tipo composto seguito da un ID seguito da un uguale e un espressione, il tutto seguito da un punto e virgola

• la parola chiave if seguita da un'espressione booleana tra parentesi e una lista, anche vuota, di comandi tra graffe; eventualmente seguito dalla parola chiave else e una lista, anche vuota, di comandi tra graffe

• la parola chiave return seguita eventualmente da un'espressione

• due ID tra un punto seguiti da delle parentesi tonde con eventualmente un espressione dentro Expr ::= <INTEGER_LITERAL> | ID |  ID'.'ID ['('[(Expr',')* Expr]')'] | Expr '+' Expr |   Expr '­' Expr |  Expr '*' Expr |  Expr '/' Expr |  'random' '('<INTEGER_LITERAL>',' <INTEGER_LITERAL>')' |  'pick' '('Expr ',' ID) |Expr'?' Expr ':' Expr  'filter' '('BasicType' ID ',' ID ')''{'Expr'}' | '!' Expr | '­' Expr | Expr ('>' | '<' | '==') Expr | Expr ('&' | '|')Expr | 'true' | 'false'|  'forall' '(' BasicType ID ',' ID ')' '{'Expr'}'';' | 'exists' '(' BasicType ID ',' ID ')' '{'Expr'}'';' Com ::= [CompoundType] ID '=' Expr ';' | 'if' '(' BEexpr ')'  '{' Com*'}' ['else' '{' Com*'}'] | 'return' [Expr]';' | ID'.'ID '('[Expr]')'

7

ESEMPI DI GIOCHI RE-IMPLEMENTATI NEL

NUOVO LINGUAGGIO E CONFRONTO CON I

MODELLI IMPLEMENTATI IN PRISM

Come più volte espresso, i quattro casi studio sono stati re-implementati in maniera significativamente più semplice e concisa. Vediamoli nel dettaglio (per una visione di insieme nelle Appendici A e B sono presenti tutti i codici sorgente), analizzando le principali differenze tra i modelli implementati nel linguaggio di PRISM – che da qui in avanti chiameremo modelli PRISM – e i modelli implementati nel nuovo linguaggio – che da qui in avanti chiameremo modelli GameDSL.

Si specifica preliminarmente che quando si parla di “problemi” riscontrati con il linguaggio di PRISM, si intendono difficoltà dovute alla semplicità di tale linguaggio, e non di problematiche vere e proprie.

Documenti correlati