II I progetti Smart T-Shirt e Snap2ino
4.2 Analisi
4.3.2 Acquisizione del sorgente e filtraggio delle informazioni
Per quanto riguarda i requisiti del primo punto, questi sono soddisfatti per mezzo della classe Main.java(fig. 4.2) definita. Questa, rappresentante
l’entry point del transpiler (esportato come file .jar), consente all’utente
l’utilizzo di Snap2ino tramite terminale (ed eventualmente l’integrazione in altri sistemi), accettando come argomento il file .xml rappresentante il Mi-
cromondo della Matrice esportato e da convertire. A partire dal file passato, una volta verificato che il formato sia quello atteso (.xml), vengono eliminate
le informazioni (i tag xml) superflue e non previste/gestite dalla grammati- ca, in modo da ottenere un contenuto conforme alla sintassi del DSL atteso. Tale operazione avviene mediante l’uso delle RegEx (Regular Expressions), attraverso le quali poter rimuovere il contenuto testuale compreso: dall’ini- zio del documento al tag <variables>, dalla chiusura del tag </variables>
alla definizione del primo script (<script>) e, infine, dalla chiusura di tale
tag (</script>) alla fine del documento. Oltre a queste, vengono rimosse
anche eventuali altre informazioni (attributi) superflue rimanenti a seguito della prima fase di filtraggio. Il risultato che si ottiene è un contenuto te- stuale costituito dalle sole sezioni descritte in precedenza (4.2.2) e conformi al DSL Snap2ino. A partire da tale contenuto è poi generato il relativo file in formato .snap2ino, utile sia per l’analisi dell’organizzazione del micro-
4.3. PROGETTAZIONE 77
mondo passato, sia come punto di partenza per la successive fasi di: lettura, comprensione, conversione e generazione dell’output.
4.3.3 Lettura e comprensione delle informazioni filtrate
Una volta generato, a partire dal Micromondo della Matrice esportato, il file.snap2ino, conforme all’organizzazione descritta in fase di analisi dell’in-
put (4.2.2), per poterlo convertire in uno sketch Wiring è prima necessario riuscire a leggerlo e capirlo. Come in precedenza accennato, per poter fa- re ciò si è ricorso alla definizione di un’apposito Domain-Specific Language (Snap2ino), per mezzo del framework Xtext, rappresentante il linguaggio composto dalle informazioni filtrate. In particolare, grazie al supporto offer- to da Xtext (generazione automatica delle classi Java rappresentanti i nodi dell’AST, delle regole per la creazione di questo, del lexer e del parser ) si è reso necessario definire esclusivamente la grammatica per questo DSL. A partire da questa, e dal metamodello EMF da essa inferito, è poi possibile ispezionare la rappresentazione in memoria dei sorgenti .snap2inoin modo
da generare, nell’ultima fase, le controparti C/C++ dei i vari costrutti in essi definiti.
Definizione della grammatica
Avendo come riferimento l’organizzazione dei tag xml definita durante la fase di analisi dell’input (fig. 4.1), si è proceduto alla realizzazione della grammatica necessaria (fig. 4.2, Snap2ino.xtext), attraverso il DSL Xtext,
in maniera incrementale e aggiungendo, man mano, costrutti in grado di rendere il metamodello EMF (fig. 4.2, modello Snap2ino.ecore), inferibile
dalle regole definite, sempre più simile al modello UML per l’organizzaizone dei tag significativi realizzato durante la fase di analisi. In particolare, si è partiti dalla definizione di una semplice grammatica, composta dalla sola sezione delle variabili, di tipo intero, e dallo script, composto da blocchi base e blocchi custom senza argomenti. Successivamente è stato esteso il supporto al tipo delle variabili, definendo ConstValue (rappresentante valori costanti, ossia interi e float, con e senza segno, e stringhe - considerandoli come se- quenze alfanumeriche XmlString) e BoolValue, e integrato il supporto agli argomenti in input per i blocchi (partendo dagli appena definiti ConstValue e BoolValue, includendo poi anche valori Option, altri blocchi e, infine, gli Script).
Una volta raggiunto il grado di similarità cercato, tra il metamodello EMF inferito e il modello dei tag significativi, la grammatica completa per il primo prototipo risulta essere la seguente:
XMLModel: variables = Variables script = Script ; Variables: {Variables} ’<variables>’ variables += Variable* ’</variables>’ ; Variable:
’<variable’ ’name=’ name = STRING ’>’ innerContent = Literal ’</variable>’ ; Script: {Script} ’<script>’ blocks += Block* ’</script>’ ; Block:
VariableBlock | BasicBlock | CustomBlock ;
VariableBlock:
’<block’ ’var=’ variable = STRING ’>’’</block>’ ;
BasicBlock:
’<block’ ’s=’ name = STRING ’>’ args += (Argument)*
’</block>’ ;
CustomBlock:
’<custom-block’ ’s=’ name = STRING ’>’ args += (Argument)*
’</custom-block>’ ;
Argument:
Script | Block | Option | Literal ;
Option: ’<l>’
4.3. PROGETTAZIONE 79
’<option>’ value = XmlString’</option>’ ’</l>’ ; Literal: BoolValue | ConstValue ; BoolValue: {BoolValue} ’<l>’? ((value ?= ’<bool>true</bool>’) | ’<bool>false</bool>’) ’</l>’? ;
// Includes strings (i.e. chars sequence without double quotes) // and signed integers/floating point numbers.
ConstValue: ’<l>’ value = XmlString ’</l>’ ; XmlString: ID XmlString? ; /*
* Custom ID defined to include both signed integer and signed * floating values.
* NB: < and > symbols are excluded due to avoid ambiguity * with the xml syntax.
*/
@Override terminal ID:
( ’\\’ . | !(’\\’|’"’|’\’’|’ ’|’\t’|’\r’|’\n’|’<’|’>’) )+ ;
Le due principali differenze evidenziabili rispetto al modello definito in fase di analisi riguardano essenzialmente:
• l’inclusione del tag<l></l>direttamente nel costrutto Option e Literal,
eliminando quindi le classi L e Value;
• il collasso della classe ParametricBlock nei rispettivi BasicBlock e Cu- stomBlock.
Inoltre si evidenzia come, analogamente al modello definito per i tag xml (fig. 4.1), anche la grammatica realizzata non prenda in considerazione gli specifici blocchi forniti dal linguaggio Snap!, o il numero/tipo degli argo- menti che questi possono, o meno, richiedere. Infatti, si è voluto rendere la
grammatica la più generica possibile per avere, da una parte, una definizione della stessa più semplice e concisa, dall’altra, una maggiore flessibilità circa la gestione dei possibili blocchi utilizzabili nel micromondo da processare. In più, è bene notare come la definizione di regole specifiche per i singoli blocchi possibili sia pressoché inutile, dal momento che si presuppone che il sorgente da processare non sia realizzato a mano ma derivante direttamente dall’e- sportazione del Micromondo della Matrice validato dall’ambiente Snap!, e quindi privo di errori.
4.3.4 Conversione delle informazioni filtrate e generazione