II I progetti Smart T-Shirt e Snap2ino
4.2 Analisi
4.2.2 Analisi sintattica del Micromondo della Matrice
Una volta definita l’organizzazione specifica del progetto Snap! Micro- mondo della Matrice, è ora possibile passare all’analisi del sorgente da esso derivante (rappresentante l’input da convertire per il tanspiler), attraverso la possibilità offerta dall’ambiente Snap! di esportare i progetti realizzati, come singoli file in formato.xml. A partire da questi, e quindi dalla sintassi
xml, è possibile analizzare e individuare quali informazioni, relativamente al progetto esportato, siano contenute e come queste siano organizzate tra loro. In particolare, tra le molte informazioni contenute, è possibile indi- viduare ciò che effettivamente ha significato per la conversione, ossia: gli Sprite definiti, le relative variabili locali e gli script in esso contenuti, e le variabili globali. Nel caso specifico del Micromondo della Matrice (e dell’e- sercizio presentato - fig. 1.4), ossia di un progetto Snap! composto da una sola Sprite, un solo script e le sole variabili locali, è possibile individuare, rimuovendo le informazioni superflue per il caso di studio, una prima por- zione di codice xml, rappresentante proprio queste ultime, in corrispondenza del sotto-tag /variables/ e una seconda, rappresentante lo script definito,
in corrispondenza del sotto-tag/scritps/script/, entrambe contenute nello
Sprite collocato inproject/stage/sprites/sprite/:
File: Micromondo Matrice - Quinta.xml
<!-- VARAIBILI LOCALI DEFINITE E VALORE ATTUALE --> <variables>
4.2. ANALISI 65 <variable name="x"> <l>2</l> </variable> <variable name="y"> <l>7</l> </variable> </variables>
<!-- CORPO DELLO SCRIPT --> <script>
<!-- BLOCCHI SENZA ARGOMENTI --> <block s="receiveGo"></block>
<custom-block s="prepara matrice"></custom-block>
<!-- BLOCCHI CON ARGOMENTI -->
<block s="doSetVar"> <!-- assegnamento di variabile --> <l>x</l> <!-- variabile da valorizzare --> <l>0</l> <!-- valore --> </block> <block s="doSetVar"> <l>y</l> <l>0</l> </block>
<!-- CICLO: RIPETI 8 VOLTE --> <block s="doRepeat"> <l>8</l> <script> <block s="doRepeat"> <l>8</l> <script>
<custom-block s="accendi led x: %n y: %n (colore r: %n g: %n b: %n )"> <block var="x"></block> <block var="y"></block> <l>0</l> <l>255</l> <l>0</l> </custom-block> <!-- assegnamento ad x di x+1 --> <block s="doSetVar"> <l>x</l> <block s="reportSum"> <!-- accesso a variabile --> <block var="x"></block> <l>1</l> </block> </block>
</script> </block> <block s="doSetVar"> <l>x</l> <l>0</l> </block> <block s="doSetVar"> <l>y</l> <block s="reportSum"> <block var="y"></block> <l>1</l> </block> </block> </script> </block> </script>
Com’è possibile notare dal listato presentato, la prima sezione contie- ne le variabili locali definite, racchiuse dal tag <variables>, caratterizzate da un nome (l’attributo name) e dal valore al momento dell’esportazione (il
sotto-tag <l>). La seconda sezione invece, costituente il corpo dello script
realizzato in Snap! (racchiuso dal tag <script>), si compone di una serie
di blocchi base (<block>) e di blochi definiti dall’utente (<custom-block>),
caratterizzati da un nome (l’attributos) ed, eventualmente, uno o più argo-
menti in input (definiti come sotto-tag). Alternativamente al proprio nome, i blocchi base possono specificare il nome di una variabile definita, attraver- so l’attributo var, per rappresentarne l’utilizzo come argomento di un altro
blocco.
Partendo dall’analisi del listato proposto, e considerando ora tutti blocchi utilizzabili nel Micromondo della Matrice (fig. 1.5), è possibile derivare lo schema UML (fig. 4.1) rappresentante l’organizzazione generale che i tag xml significativi possono avere, circa le due sezioni di codice appena individuate, rappresentante la sintassi per il sorgente (filtrato) da convertire. In tale schema, si evidenzia la presenza di alcuni stereotipi, usati per meglio definire l’organizzazione sintattica degli elementi sotto esame:
• «xml tag»: identifica una classe rappresentante un tag xml;
• «inner content»: identifica un’associazione di composizione, legante un tag genitore agli eventuali tag figli (subtag );
• «inner value»: identifica il contenuto testuale (quindi non un tag) contenuto all’interno di un tag.
Per l’UML definito, si precisa come le istanze di Literal (ossia i tag nella forma<l>valore-alfanumerico<l>oppure<l><bool>true-false</bool></l>),
4.2. ANALISI 67
Figura 4.1: Organizzazione sintattica dei tag xml (significativi) per un generico progetto/Micromondo Snap! esportato.
così come quelle di Block, siano associate, rispettivamente, a Variable e Script opzionalmente, poiché rappresentanti, esclusivamente, o i valori assunti dal- le variabili, le prime, e i blocchi contenuti in uno script, le seconde, o gli argomenti in input di un blocco.
Oltre a questo, è anche importante notare che, nell’UML definito, non sono specificati vincoli circa il tipo (e il numero) degli argomenti accettati da un dato blocco e, in generale, non sia tenuto conto della compatibilità tra il tipo di un blocco contenuto (ossia un subtag ) e il relativo blocco genitore (p.e. è ammesso che un blocco ripeti sempre sia argomento di un blocco che accetta solo valori interi). Questo perché si presuppone che l’input fornito corrisponda a un micromondo già validato dall’ambiente Snap! e quindi corretto. Da ciò ne consegue, quindi, che il transpiler da realizzare non deve effettuare alcun controllo circa la correttezza (semantica) del sorgente
passato.
In definitiva, quindi, a seguito dell’analisi sintattica effettuata è possibile stabilire quanto segue.
Il sorgente in input da processare consiste in un file in formato xml, rappre- sentante il Micromondo della Matrice validato e corretto. Questo, tolte le informazioni superflue per la conversione, si compone di due sezioni, rispet- tanti la sintassi definita dallo schema della figura 4.1. La prima rappresenta le variabili locali definite e il valore di queste al momento dell’esportazione, la seconda lo script eseguibile, composto da una serie di blocchi Snap! di cui il primo è sempre "quando si clicca su [bandierina verde]".