• Non ci sono risultati.

In questa sezione vi `e la descrizione vera e propria del linguaggio. L’NXT-GTD, tranne qualche caso, `e costituito da elementi molto simili per quanto riguarda la struttura, infatti ciascuno `e composto da:

• un nome del blocco che rappresenta l’azione che il robot deve svolgere • una serie di attributi costituiti dalla coppia nome = valore

• eventuali commenti

Si `e scelto di usare l’evidenziatura ”keyword” per i nomi dei comandi, l’e-videnziatura ”type” per i nomi dei parametri e l’el’e-videnziatura ”value” per i valori assegnati ai comandi e per i numeri. Abbiamo gi`a visto nell’header l’intenzione di suddividere i comandi in due gruppi: keyword e type. Me-diante il tag group, con una logica associazione di significati, verr`a fatto un raggruppamento dei tag che rappresentano i nomi dei comandi e uno dei loro attributi.

Viene riportato di seguito la definizione di un comando d’esempio poi-ch´e, tutti gli altri si possono ottenere in modo simile sostituendo i nomi delle variabili. Il comando scelto d’esempio `e il comando Sposta del quale nel paragrafo 1.4 `e presente la descrizione letterale. Il codice bflang `e il seguente:

0 < d e f i n i t i o n >

< c o n t e x t s y m b o l s = " ; ( ) { } [ ] : \&#34;\\ ’ ,& gt ;& lt ;*& amp ; ^ % ! + = - | / ? # & # 9 ; & # 1 0 ; & # 1 3 ; " >

2 < g r o u p h i g h l i g h t = " k e y w o r d " >

< a u t o c o m p l e t e e n a b l e = " 1 " a p p e n d = " ( " / >

4 < e l e m e n t p a t t e r n = " S p o s t a " id = " i d S p o s t a " > < r e f e r e n c e >

6 < b > P a r a m e t r i a c c e t t a t i : < / b >

Porte , Dir , StSin , StDes , Sterza , Pot , Dur , P r o s A z

8 < / r e f e r e n c e > < c o n t e x t s y m b o l s = " ( ) = . , & # 1 0 ; & # 1 3 ; " i d r e f = " i d S p o s t a " > 10 < g r o u p h i g h l i g h t = " t y p e " i s _ r e g e x = " 1 " > 12 < a u t o c o m p l e t e e n a b l e = " 1 " a p p e n d = " = " / > < e l e m e n t p a t t e r n = " P o r t e " / > 14 < e l e m e n t p a t t e r n = " Dir " / > < e l e m e n t p a t t e r n = " S t S i n " / > 16 < e l e m e n t p a t t e r n = " S t D e s " / > < e l e m e n t p a t t e r n = " S t e r z a " / > 18 < e l e m e n t p a t t e r n = " Pot " / > < e l e m e n t p a t t e r n = " P r o s A z " / > 20 < e l e m e n t p a t t e r n = " Dur " / > < e l e m e n t p a t t e r n = " M o t o r e S i n " / > 22 < e l e m e n t p a t t e r n = " M o t o r e D e s " / > < e l e m e n t p a t t e r n = " M o t o r e A l t " / > 24 < / g r o u p > 26 < g r o u p h i g h l i g h t = " v a l u e " i s _ r e g e x = " 1 " > < a u t o c o m p l e t e e n a b l e = " 1 " / > 28 < e l e m e n t p a t t e r n = " A " / >

< e l e m e n t p a t t e r n = " B " / > 30 < e l e m e n t p a t t e r n = " C " / > < e l e m e n t p a t t e r n = " AB " / > 32 < e l e m e n t p a t t e r n = " AC " / > < e l e m e n t p a t t e r n = " BC " / > 34 < e l e m e n t p a t t e r n = " ABC " / > < e l e m e n t p a t t e r n = " AVA " / > 36 < e l e m e n t p a t t e r n = " IND " / > < e l e m e n t p a t t e r n = " S T O P " / > 38 < e l e m e n t p a t t e r n = " I L L I M " / > < e l e m e n t p a t t e r n = " GRA " / > 40 < e l e m e n t p a t t e r n = " ROT " / > < e l e m e n t p a t t e r n = " s " / > 42 < e l e m e n t p a t t e r n = " F R E N A " / > < e l e m e n t p a t t e r n = " F O L L E " / > 44 < e l e m e n t p a t t e r n = " V E R O " / > < e l e m e n t p a t t e r n = " F A L S O " / > 46 < / g r o u p > 48 < ! - - c o m m e n t i - - > < e l e m e n t i d r e f = " e . c o m m e n t " / > 50 < ! - - p u n t e g g i a t u r e - - > < e l e m e n t i d r e f = " e . n u m b e r " / > 52 < e l e m e n t i d r e f = " e . d o u b l e s t r i n g " / > < e l e m e n t i d r e f = " e . s i n g l e s t r i n g " / > 54 < e l e m e n t p a t t e r n = " ) " e n d s _ c o n t e x t = " 1 " / > < / c o n t e x t > 56 < / e l e m e n t >

Il tag autocomplete viene usato per far aggiungere in automatico la parentesi tonda aperta dopo la scrittura del nome del comando ed il simbolo di uguale dopo la scrittura di un parametro. `E possibile far aggiungere un qualsiasi testo si voglia, e nel caso si debbano inserire degli ulteriori dati in mezzo alla stringa aggiunta si pu`o usare l’attributo backup cursor per far tornare indietro il cursore in automatico. Ad esempio, supponendo di voler velocizzare la scrittura di una funzione possiamo specificare gli attributi

append = "(Parametro1 = , Parametro2 = )" backup_cursor = "16"

sicch´e il cursore si porta dopo il primo uguale velocizzando di molto la scrittura, in particolar modo per un utente esperto.

Il tag reference `e stato usato in questo caso per suggerire i parametri che il comando accetta. Questo tipo di suggerimento viene visualizzato durante la digitazione ed `e diverso dal suggerimento dei comandi attivabile alla pressione

del primo carattere, poich´e esso viene popolato in automatico con gli attributi pattern di tutti gli elementi definiti.

Particolare attenzione bisogna prestare all’inserimento di un ulteriore tag context all’interno dell’element che definisce il nome del comando. Esso ci permette di fare in modo che gli elementi definiti all’interno di Sposta non vengano riconosciuti all’esterno delle parentesi del comando stesso. Poich´e es-si non sono riconosciuti all’esterno del blocco, non sono nemmeno evidenziati, fornendoci un test visuale sulla correttezza della posizione di tali elementi. Vi `

e per`o un aspetto negativo in questa tecnica, che consiste nel dover definire elementi comuni a pi`u comandi pi`u volte, una per ciascuno di essi. Nel caso di elementi la cui definizione non `e banale, la ripetizione della definizione appesantirebbe molto il codice, problema a cui si pu`o ovviare facendo l’uso di riferimenti ai comandi, mediante idref. Nell’esempio di Sposta vi sono quattro riferimenti ad elementi che definiscono: la sintassi per i commenti, i numeri, e le stringhe. Il codice di definizione di tali elementi `e il seguente:

0 < ! - - c o m m e n t i - - > < e l e m e n t id = " e . c o m m e n t " p a t t e r n = " - - [ ^ & # 1 0 ; & # 1 3 ; ] * " 2 h i g h l i g h t = " line - c o m m e n t " i s _ r e g e x = " 1 " / > 4 < ! - - n u m e r i - - > < e l e m e n t id = " e . n u m b e r " p a t t e r n = " [0 -9.]+ " i s _ r e g e x = " 1 " h i g h l i g h t = " v a l u e " / > 6 < ! - - s t r i n g h e fra d o p p i o a p i c e - - > 8 < e l e m e n t id = " e . d o u b l e s t r i n g " p a t t e r n = " & # 3 4 ; " h i g h l i g h t = " s t r i n g " > < c o n t e x t s y m b o l s = " \ & # 3 4 ; nrt " h i g h l i g h t = " s t r i n g " > 10 < e l e m e n t p a t t e r n = " \\. " i s _ r e g e x = " 1 " h i g h l i g h t = " s t r i n g " / > < e l e m e n t p a t t e r n = " & # 3 4 ; " h i g h l i g h t = " s t r i n g " e n d s _ c o n t e x t = " 1 " / > 12 < / c o n t e x t > < / e l e m e n t > 14 < ! - - s t r i n g h e fra s i n g o l o a p i c e - - > 16 < e l e m e n t id = " e . s i n g l e s t r i n g " p a t t e r n = " ’ " h i g h l i g h t = " s t r i n g " > < c o n t e x t s y m b o l s = " \ ’ " h i g h l i g h t = " s t r i n g " > 18 < e l e m e n t p a t t e r n = " \\. " i s _ r e g e x = " 1 " h i g h l i g h t = " s t r i n g " / > < e l e m e n t p a t t e r n = " ’ " h i g h l i g h t = " s t r i n g " e n d s _ c o n t e x t = " 1 " / > 20 < / c o n t e x t > < / e l e m e n t >

Questi quattro elementi sono posizionati nel codice all’interno del context pi`u esterno contenuto nel tag definition e vengono richiamati nella definizione di

ogni comando.

Per questo difetto nel modo di descrivere un comando `e stato scelto di utilizzare una politica diversa nella definizione del comando MioBlocco. Esso permette di definire un blocco personalizzato specificandone il nome, i nomi dei parametri e i loro tipi, e le azioni da compiere (usando altri comandi del linguaggio GTD). Poich´e qualsiasi comando pu`o essere usato al suo interno, usando la stessa tecnica di Sposta sarebbe necessario elencare nel context i riferimenti per tutti i comandi dell’intero linguaggio. Si `e perci`o scelto di de-finire gli attributi di MioBlocco come elementi singoli e slegati dal comando stesso. 0 < e l e m e n t p a t t e r n = " I m p U s c " h i g h l i g h t = " s k e y w o r d " i s _ r e g e x = " 1 " > < a u t o c o m p l e t e e n a b l e = " 1 " 2 a p p e n d = " ( N o m e = , Val = ) " b a c k u p _ c u r s o r = " 9 " > 4 < / a u t o c o m p l e t e > < r e f e r e n c e > 6 < b > N o m e < / b > s e g u e la s t r u t t u r a :

N o m e = & lt ; n o m e del p a r a m e t r o & gt ;.[ L O G I C A | NUM | T E S T O ]

8 < / r e f e r e n c e > < / e l e m e n t > 10 < g r o u p i s _ r e g e x = " 1 " > 12 < a u t o c o m p l e t e e n a b l e = " 1 " a p p e n d = " = SI " / > < e l e m e n t p a t t e r n = " N o m e " h i g h l i g h t = " t y p e " / > 14 < e l e m e n t p a t t e r n = " P a r I n " h i g h l i g h t = " s k e y w o r d " / > < e l e m e n t p a t t e r n = " P a r U s c " h i g h l i g h t = " s k e y w o r d " / > 16 < e l e m e n t p a t t e r n = " Val " h i g h l i g h t = " t y p e " / > < / g r o u p > 18 < e l e m e n t p a t t e r n = " NUM " h i g h l i g h t = " v a l u e " i s _ r e g e x = " 1 " / > 20 < e l e m e n t p a t t e r n = " L O G I C A " h i g h l i g h t = " v a l u e " i s _ r e g e x = " 1 " / >

Altri elementi con una struttura differente da quella descritta per il comando Sposta sono le parentesi, per le quali va definita la funzione di raggruppa-mento del codice al loro interno come un unico blocco, e il riconosciraggruppa-mento delle etichette. Si noti l’uso di espressioni regolari nel campo pattern per il riconoscimento delle etichette, alla loro definizione (label:) e al loro utilizzo (label.VERO, label.SE, . . . ). Il codice usato `e il seguente:

s t a r t s _ b l o c k = " 1 " 2 h i g h l i g h t = " bracket - c u r l y " b l o c k _ n a m e = " C u r l y b r a c k e t s b l o c k " / > 4 < e l e m e n t p a t t e r n = " } " e n d s _ b l o c k = " 1 " 6 b l o c k s t a r t e l e m e n t = " e . l b r a c e " h i g h l i g h t = " bracket - c u r l y " / > 8 < e l e m e n t id = " e . l b r a c k e t " p a t t e r n = " [ " 10 s t a r t s _ b l o c k = " 1 " h i g h l i g h t = " bracket - s q u a r e " 12 b l o c k _ n a m e = " S q u a r e b r a c k e t s b l o c k " / > < e l e m e n t p a t t e r n = " ] " 14 e n d s _ b l o c k = " 1 " b l o c k s t a r t e l e m e n t = " e . l b r a c k e t " 16 h i g h l i g h t = " bracket - s q u a r e " / > 18 < e l e m e n t id = " e . l p a r e n " p a t t e r n = " ( " s t a r t s _ b l o c k = " 1 " 20 h i g h l i g h t = " bracket - r o u n d " b l o c k _ n a m e = " P a r e n t h e s e s b l o c k " / > 22 < e l e m e n t p a t t e r n = " ) " e n d s _ b l o c k = " 1 " 24 b l o c k s t a r t e l e m e n t = " e . l p a r e n " h i g h l i g h t = " bracket - r o u n d " / > 26 < e l e m e n t p a t t e r n = " [ A - Za - z0 - 9 ] + \ : " 28 h i g h l i g h t = " tag " i s _ r e g e x = " 1 " / > < e l e m e n t p a t t e r n = " [ A - Za - z0 - 9 ] + \ . SE " 30 h i g h l i g h t = " special - tag " i s _ r e g e x = " 1 " / > < e l e m e n t p a t t e r n = " [ A - Za - z0 - 9 ] + \ . E L S E " 32 h i g h l i g h t = " special - tag " i s _ r e g e x = " 1 " / > < e l e m e n t p a t t e r n = " [ A - Za - z0 - 9 ] + \ . V E R O " 34 h i g h l i g h t = " special - tag " i s _ r e g e x = " 1 " / > < e l e m e n t p a t t e r n = " [ A - Za - z0 - 9 ] + \ . F A L S O " 36 h i g h l i g h t = " special - tag " i s _ r e g e x = " 1 " / >

Come si pu`o notare i tag utilizzabili per la descrizione di una sintassi mediante bflang non sono molti, e la loro combinazione `e molto intuitiva. Le sintassi con cui si pu`o trovare maggiore difficolt`a, sono quelle in cui le parole chiave sono strutturate in particolari gerarchie non fisse i cui elementi sono interscambiabili (ad esempio HTML). In questi casi la definizione `e comunque possibile ma risulta meno immediata che nella descrizione di linguaggi le cui parole chiave, anche se molte, si presentano quasi sempre isolate o senza

Capitolo 5

Estensione dell’editor

Una volta creato il file nxt-gtd.bflang2 bisogna fare in modo che Bluefish lo riconosca e lo carichi assieme agli altri linguaggi. Per far ci`o `e sufficiente copiare il file di definizione nella cartella bluefish , che `e il percorso da cui l’editor prende i file dei linguaggi personalizzati. Se un file porta lo stesso nome di uno di quelli standard (salvato nella cartella bflang), esso viene utilizzato al posto di quello originale senza sovrascriverlo.

Sistemi Windows

In caso di sistemi operativi Windows bisogna per prima cosa trovare la cartel-la Bluefish, cartel-la quale si trova dove ci sono tutte le instalcartel-lazioni dei programmi. Alcuni path possibili sono:

C:\Program Files\Bluefish} C:\Programmi\Bluefush C:\Programmi(x86)\Bluefish

Trovata la cartella principale, il file di definizione va copiato nel percorso: /.bluefish/.

Per associare Bluefish ad un file con estensione nxtd `e sufficiente seguire i seguenti semplici passi:

1. clic con il tasto destro del mouse sul file *.nxtd 2. premere Apri con...

3. Selezionare Bluefish dalla lista di programmi (eventualmente cercarlo tramite il tasto Sfoglia...

4. Spuntare la casella Usa sempre questo programma e premere OK. Da questo momento in poi verr`a usato Bluefish come applicazione predefinita per i file di tipo nxtd. All’apertura, sar`a sufficiente selezionare la modalit`a di linguaggio corretta per poter lavorare agevolmente sul file.

Sistemi Linux

Per sistemi operativi linux, il file di definizione va copiato nella cartella: /.bluefish/. Per far si che Bluefish riconosca l’estensione nxtd `e necessario aggiungere il mime type: text/x-nxtd. Per far ci`o bisogna modificare il fi-le HOME/.local/share/mime/packages/Override.xml o crearlo nel caso esso non sia gi`a esistente (`e necessario l’accesso come root). Una volta aperto esso avr`a la seguente forma:

<?xml version="1.0" encoding="UTF-8"?>

<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info"> <mime-type type="... MIME type ...">

<comment> ... comment ... </comment> <glob pattern="*..."/>

<icon name="...name..."> </mime-type>

<mime-type type="... another MIME type ..."> ... other child elements ...

</mime-type> .... etc. </mime-info>

quello che dobbiamo fare `e aggiungere il seguente codice all’interno del tag mime-info:

<mime-type type="text/x-nxtd"> <glob pattern="*nxtd"/>

</mime-type>

e dopo aver salvato il file, eseguire da terminale il comando:

update-mime-database ~/.local/share/mime

Bluefish caricher`a in automatico tutti i linguaggi presenti nella cartella bflang e li render`a disponibili per il programmatore. Per rendere effettive le modi-fiche `e necessario riavviare il programma.

Una volta aperto l’editor `e possibile selezionare il linguaggio dal men`u: Documento->Modalit`a linguaggio->NXT-GTD.

L’evidenziazione delle parole segue alcuni stili predefiniti i quali possono es-sere personalizzati dalle preferenze dell’editor (Modifica->Preferenze->Stili di testo). Comparir`a una finestra come quella di figura 5 dalla quale sar`a possibile definire colore, peso, sfondo e stile dell’evidenziazione. Mediante il tasto aggiungi voce `e inoltre possibile definire degli stili personalizzati senza dover modificare quelli di default.

Figura 5.1: Opzioni degli stili di evidenziazione.

Selezionando la voce supporto per il linguaggio dal men`u a sinistra, `e possibile modificare in modo visuale i valori dei tag option (nel riquadro superiore a destra) e highlight (nel riquadro in basso a destra) definiti nella sezione header del codice bflang.

Nella figura 5 `e possibile vedere l’effetto dell’evidenziazione su di un esempio di codice.

Figura 5.2: Opzioni del linguaggio.

Conclusioni

Bluefish, con la sua portabilit`a e la sua funzionalit`a risulta essere un buon editor di testo, che cerca di andare incontro alle esigenze del programmato-re. La semplicit`a e l’immediatezza con cui `e possibile estendere l’editor ne fanno lo strumento pi`u adatto per chi vuole uno strumento da usare con un linguaggio personale non usato nel panorama informatico.

Il linguaggio NXT-GTD ha una struttura abbastanza diversa dai lin-guaggi di programmazione pi`u consoni sulla base dei quali `e stato sviluppato bflang. Nonostante questo, bflang risulta essere adeguato ad avere una descri-zione buona del linguaggio e permette diversi livelli di specificit`a a seconda di ci`o che pi`u preme allo sviluppatore. Sarebbe stato possibile creare una definizione pi`u basilare basata sulla semplice elencazione delle parole chia-ve che per`o non avrebbe fornito alcuno strumento di limitazione degli errori (`e importante per`o ricordare che la semplice evidenziazione del codice non assicura la correttezza dello stesso).

Limiti di Bluefish

Sarebbe stato comodo poter implementare un metodo che riconoscesse le etichette uguali e le evidenziasse nel testo in modo differente, indicando il punto di definizione della stessa (il punto in cui `e stata usata la prima volta). Bluefish per`o (a questa versione) non fornisce strumenti che ne permettano l’implementazione e le etichette non vengono quindi distinte tra loro.

Bibliografia

[1] Dimitris Alimisis. Teacher Education on Robotics-Enhanced Constructi-vist Pedagogical Methods. ASPETE, 2009.

[2] Paolo Pialorsi. XML. Il nuovo linguaggio del web. Mondadori Informatica, 2002.

[3] Harold Elliotte Rusty, Scott W. Means. XML Guida di riferimento. Apogeo.

Siti internet

• bluefish.openoffice.nl • bluefish.openoffice.nl/ns/bflang/2.0/schema.html • blog.gmane.org • w3.org/XML/Schema • html.it/xml • mindstorms.lego.com

Documenti correlati