implementazione di un motore per la colorazione della sintassi in gtksourceview relatore: riccardo...

34
Implementazione di un Implementazione di un motore per la colorazione motore per la colorazione della sintassi in della sintassi in GtkSourceView GtkSourceView Relatore: Riccardo Sisto Candidati: Emanuele Aina Marco Barisione

Upload: timoteo-santi

Post on 01-May-2015

214 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Implementazione di un motore per la colorazione della sintassi in GtkSourceView Relatore: Riccardo Sisto Candidati: Emanuele Aina Marco Barisione

Implementazione di un motore per Implementazione di un motore per la colorazione della sintassi in la colorazione della sintassi in

GtkSourceViewGtkSourceView

Relatore:Riccardo Sisto

Candidati:Emanuele AinaMarco Barisione

Page 2: Implementazione di un motore per la colorazione della sintassi in GtkSourceView Relatore: Riccardo Sisto Candidati: Emanuele Aina Marco Barisione

GtkSourceViewGtkSourceView

Widget di testo per GTK 2 con funzionalità Widget di testo per GTK 2 con funzionalità avanzate per la programmazioneavanzate per la programmazione

Page 3: Implementazione di un motore per la colorazione della sintassi in GtkSourceView Relatore: Riccardo Sisto Candidati: Emanuele Aina Marco Barisione

Limiti del motore attualeLimiti del motore attuale

Impossibilità di gestire strutture annidateImpossibilità di gestire strutture annidate#if 0#if 0

# if A# if A

# endif# endif

#endif#endif

nessunacolorazione #if 0

// FIXME: commentoprintf ("hello \n world");// FIXME: commentoprintf ("hello \n world");

Page 4: Implementazione di un motore per la colorazione della sintassi in GtkSourceView Relatore: Riccardo Sisto Candidati: Emanuele Aina Marco Barisione

Limiti del motore attualeLimiti del motore attuale

JavaScript dentro HTML:JavaScript dentro HTML:<script language="javascript"> if (a<b) language = "stringa"; variabile = "stringa";</script>

<script language="javascript"> if (a<b) language = "stringa"; variabile = "stringa";</script>

Page 5: Implementazione di un motore per la colorazione della sintassi in GtkSourceView Relatore: Riccardo Sisto Candidati: Emanuele Aina Marco Barisione

ObiettiviObiettivi

Gestire costrutti complessiGestire costrutti complessi Linguaggi all'interno di altri linguaggi (JavaScript Linguaggi all'interno di altri linguaggi (JavaScript

in HTML)in HTML) Semplicità nella descrizione dei linguaggi Semplicità nella descrizione dei linguaggi

Non deve essere necessario programmareNon deve essere necessario programmare Buone prestazioniBuone prestazioni

Nell'uso interattivo non devono essere visibili Nell'uso interattivo non devono essere visibili rallentamentirallentamenti

Page 6: Implementazione di un motore per la colorazione della sintassi in GtkSourceView Relatore: Riccardo Sisto Candidati: Emanuele Aina Marco Barisione

Tecnologie esistentiTecnologie esistenti

ColorerColorer Eccessiva complessitàEccessiva complessità

KateKate Esposizione dell’implementazione nelle descrizioni dei linguaggiEsposizione dell’implementazione nelle descrizioni dei linguaggi

ScintillaScintilla Necessità di scrivere un lexer in C per ogni linguaggioNecessità di scrivere un lexer in C per ogni linguaggio

VIMVIM Descrizioni basate su un motore di scriptingDescrizioni basate su un motore di scripting L’analisi è eseguita solo su una porzione del testoL’analisi è eseguita solo su una porzione del testo

Page 7: Implementazione di un motore per la colorazione della sintassi in GtkSourceView Relatore: Riccardo Sisto Candidati: Emanuele Aina Marco Barisione

Nuovo motore: annidamentiNuovo motore: annidamenti

Corretta gestione di strutture annidateCorretta gestione di strutture annidate

#if 0#if 0

# if A# if A

# endif# endif

#endif#endif

nessunacolorazione #if 0

#if A

Page 8: Implementazione di un motore per la colorazione della sintassi in GtkSourceView Relatore: Riccardo Sisto Candidati: Emanuele Aina Marco Barisione

Nuovo motore: contestiNuovo motore: contesti

Contesto: porzione di testo con significato Contesto: porzione di testo con significato sintatticosintattico Esempi: commenti, stringhe o parole chiaveEsempi: commenti, stringhe o parole chiave

Espressioni regolariEspressioni regolari Flessibilità nel riconoscimento di porzioni di testoFlessibilità nel riconoscimento di porzioni di testo Impossibilità di riconoscere costrutti complicatiImpossibilità di riconoscere costrutti complicati Mancanza di ricorsivitàMancanza di ricorsività Regolano le transizioni fra un contesto e l'altroRegolano le transizioni fra un contesto e l'altro

Page 9: Implementazione di un motore per la colorazione della sintassi in GtkSourceView Relatore: Riccardo Sisto Candidati: Emanuele Aina Marco Barisione

XMLXML

Standard W3CStandard W3C EstensibileEstensibile

Il significato degli elementi è definito dallo Il significato degli elementi è definito dallo sviluppatoresviluppatore

Ampia diffusione e supportoAmpia diffusione e supporto Validazione automaticaValidazione automatica

DTDDTD SchemaSchema Relax NGRelax NG

Page 10: Implementazione di un motore per la colorazione della sintassi in GtkSourceView Relatore: Riccardo Sisto Candidati: Emanuele Aina Marco Barisione

ContestiContesti semplici semplici

Non contengono sotto-contestiNon contengono sotto-contesti Identificati da un'unica espressione regolareIdentificati da un'unica espressione regolare

<context id="include"><context id="include">

<match><match>

^#include ".*?"^#include ".*?"

</match></match>

</context></context>

Page 11: Implementazione di un motore per la colorazione della sintassi in GtkSourceView Relatore: Riccardo Sisto Candidati: Emanuele Aina Marco Barisione

Contesti contenitoreContesti contenitore

Delimitati da un'espressione regolare di inizio e Delimitati da un'espressione regolare di inizio e da una di fineda una di fine<context id="string"><context id="string">

<start>"</start><start>"</start>

<end>"</end><end>"</end>

<include><include>

<context id="escape"><context id="escape">

<match>\\.</match><match>\\.</match>

Page 12: Implementazione di un motore per la colorazione della sintassi in GtkSourceView Relatore: Riccardo Sisto Candidati: Emanuele Aina Marco Barisione

Contesti keywordContesti keyword

Lista di parole chiaveLista di parole chiave<context id="keywords"><context id="keywords">

<keyword>for</keyword><keyword>for</keyword>

<keyword>if</keyword><keyword>if</keyword>

[…][…]

</context></context> Internamente sono contesti sempliciInternamente sono contesti semplici

Page 13: Implementazione di un motore per la colorazione della sintassi in GtkSourceView Relatore: Riccardo Sisto Candidati: Emanuele Aina Marco Barisione

Contesti sub-patternContesti sub-pattern

Non sono veri contestiNon sono veri contesti Identificano una porzione di un'espressione regolareIdentificano una porzione di un'espressione regolare

• Corrispondono ad un "sub-pattern" di una espressione Corrispondono ad un "sub-pattern" di una espressione regolareregolare

• Numerati a partire da 1Numerati a partire da 1 Possono essere contenuti in contesti sempliciPossono essere contenuti in contesti semplici

<context id="include"><context id="include"> <match>#include ("[^"]*")</match><match>#include ("[^"]*")</match> <include><include> <context sub-pattern="1"/><context sub-pattern="1"/>

Page 14: Implementazione di un motore per la colorazione della sintassi in GtkSourceView Relatore: Riccardo Sisto Candidati: Emanuele Aina Marco Barisione

Estensione dei contestiEstensione dei contesti

I contesti possono estendere il genitoreI contesti possono estendere il genitore

Non sempre è ciò che si vuoleNon sempre è ciò che si vuole

Attributo Attributo extend-parentextend-parent del tag del tag <context><context>

"hello \" world"

escape

string

<script> // Commento </script>

Page 15: Implementazione di un motore per la colorazione della sintassi in GtkSourceView Relatore: Riccardo Sisto Candidati: Emanuele Aina Marco Barisione

StiliStili

Separazione tra presentazione e descrizioneSeparazione tra presentazione e descrizione Nome visibile all'utenteNome visibile all'utente Associazione a stili predefinitiAssociazione a stili predefiniti

<style id="comment"<style id="comment" name="Comment"name="Comment" map-to="def:comment"/>map-to="def:comment"/>

Associazione dello stile al contesto con l'attributo Associazione dello stile al contesto con l'attributo style-refstyle-ref Più contesti possono usare lo stesso stilePiù contesti possono usare lo stesso stile

Page 16: Implementazione di un motore per la colorazione della sintassi in GtkSourceView Relatore: Riccardo Sisto Candidati: Emanuele Aina Marco Barisione

Riuso del codiceRiuso del codice

Definire espressioni regolari usate frequentementeDefinire espressioni regolari usate frequentemente Tag Tag <define-regex id="nome"><define-regex id="nome"> Riferimento all'espressione regolare con Riferimento all'espressione regolare con \%{nome}\%{nome}

Riferimento a contesti già definiti (attributo Riferimento a contesti già definiti (attributo refref)) Più contesti contengono lo stesso sotto-contestoPiù contesti contengono lo stesso sotto-contesto

Importazione di altre descrizioniImportazione di altre descrizioni C++ aggiunge solo alcune keyword al CC++ aggiunge solo alcune keyword al C

def.lang contiene alcune definizioni comunidef.lang contiene alcune definizioni comuni

Page 17: Implementazione di un motore per la colorazione della sintassi in GtkSourceView Relatore: Riccardo Sisto Candidati: Emanuele Aina Marco Barisione

AnalisiAnalisi

Viene analizzata una riga per voltaViene analizzata una riga per volta Ad ogni carattere si verifica se vi è una transizione dal contesto Ad ogni carattere si verifica se vi è una transizione dal contesto

corrente verso un altro contestocorrente verso un altro contesto

Contesti contenitoreContesti contenitore Il motore entra nel contesto quando trova l'espressione iniziale in Il motore entra nel contesto quando trova l'espressione iniziale in <start><start>

Il motore esce dal contesto quando trova l'espressione finale in Il motore esce dal contesto quando trova l'espressione finale in <end><end>

Contesti sempliciContesti semplici Il motore si sposta dopo la corrispondenza in Il motore si sposta dopo la corrispondenza in <match><match>

Page 18: Implementazione di un motore per la colorazione della sintassi in GtkSourceView Relatore: Riccardo Sisto Candidati: Emanuele Aina Marco Barisione

if-in-if0

Esempio di analisiEsempio di analisi

#if 0#if 0

# if A# if A

# endif# endif

#endif#endif

/* […]/* […]

* FIXME* FIXME

* […]* […]

*/*/

c if0 if-in-if0

comment fixme

if0 fixme commentStato corrente:Stato corrente: c

Page 19: Implementazione di un motore per la colorazione della sintassi in GtkSourceView Relatore: Riccardo Sisto Candidati: Emanuele Aina Marco Barisione

Albero degli statiAlbero degli stati

L'insieme degli stati per ogni posizione nel testo è L'insieme degli stati per ogni posizione nel testo è rappresentato da un alberorappresentato da un albero

c [0; 57]

comment [30; 57]if0 [0; 29]

fixme [40; 45]if-in-if0 [6; 22]

Alla posizione 25 lo stato è: Alla posizione 25 lo stato è: c c if0 if0

Page 20: Implementazione di un motore per la colorazione della sintassi in GtkSourceView Relatore: Riccardo Sisto Candidati: Emanuele Aina Marco Barisione

Accelerazione dell'analisiAccelerazione dell'analisi

Ricerca delle corrispondenze ancorata o menoRicerca delle corrispondenze ancorata o meno Prima implementazione:Prima implementazione:

Per ogni carattere provate tutte le possibili transizionePer ogni carattere provate tutte le possibili transizione Seconda implementazione:Seconda implementazione:

Fusione di tutte le possibili transizioni in un'unica Fusione di tutte le possibili transizioni in un'unica espressione regolareespressione regolare

Suddivisione in due fasi:Suddivisione in due fasi:• Ricerca della posizione della prima transizioneRicerca della posizione della prima transizione• Ricerca della destinazione della transizioneRicerca della destinazione della transizione

Miglioramento di un ordine di grandezzaMiglioramento di un ordine di grandezza

Page 21: Implementazione di un motore per la colorazione della sintassi in GtkSourceView Relatore: Riccardo Sisto Candidati: Emanuele Aina Marco Barisione

Modifiche al testoModifiche al testo

Non è possibile rianalizzare l'intero file ad ogni Non è possibile rianalizzare l'intero file ad ogni modificamodifica

Riciclare i contesti presenti prima della modificaRiciclare i contesti presenti prima della modifica I contesti che precedono la riga modificata vengono I contesti che precedono la riga modificata vengono

riciclati così come sonoriciclati così come sono La riga viene rianalizzataLa riga viene rianalizzata Quando lo stato vecchio e quello nuovo coincidono si Quando lo stato vecchio e quello nuovo coincidono si

possono riciclare tutti i contesti successivipossono riciclare tutti i contesti successivi

Page 22: Implementazione di un motore per la colorazione della sintassi in GtkSourceView Relatore: Riccardo Sisto Candidati: Emanuele Aina Marco Barisione

Esempio di modifica del testoEsempio di modifica del testo

a = 42 / primo */ + 1 /* secondo */;

c [0; 36]error [15; 17]

decimal [4; 6]

comment [22; 35]

decimal [20; 21]

Page 23: Implementazione di un motore per la colorazione della sintassi in GtkSourceView Relatore: Riccardo Sisto Candidati: Emanuele Aina Marco Barisione

Esempio di modifica del testoEsempio di modifica del testo

a = 42 /* primo */ + 1 /* secondo */;

c [0; ?]

error [15 +1; 17 +1]

decimal [4; 6]

comment [22 +1; 35 +1]

decimal [20 +1; 21 +1]c [0; 36 +1]

Page 24: Implementazione di un motore per la colorazione della sintassi in GtkSourceView Relatore: Riccardo Sisto Candidati: Emanuele Aina Marco Barisione

c [0; ?]

Esempio di modifica del testoEsempio di modifica del testo

a = 42 /* primo */ + 1 /* secondo */;

c [0; 37]error [16; 18]

decimal [4; 6]

comment [23; 36]

decimal [21; 22]

Page 25: Implementazione di un motore per la colorazione della sintassi in GtkSourceView Relatore: Riccardo Sisto Candidati: Emanuele Aina Marco Barisione

c [0; ?]

Esempio di modifica del testoEsempio di modifica del testo

a = 42 /* primo */ + 1 /* secondo */;

c [0; 37]error [16; 18]

decimal [4; 6]

comment [23; 36]

decimal [21; 22]

decimal [4; 6]

Page 26: Implementazione di un motore per la colorazione della sintassi in GtkSourceView Relatore: Riccardo Sisto Candidati: Emanuele Aina Marco Barisione

c [0; ?]

Esempio di modifica del testoEsempio di modifica del testo

a = 42 /* primo */ + 1 /* secondo */;

c [0; 37]error [16; 18]

decimal [4; 6]

comment [23; 36]

decimal [21; 22]

decimal [4; 6]

comment [7; ?]

Page 27: Implementazione di un motore per la colorazione della sintassi in GtkSourceView Relatore: Riccardo Sisto Candidati: Emanuele Aina Marco Barisione

c [0; ?]

Esempio di modifica del testoEsempio di modifica del testo

a = 42 /* primo */ + 1 /* secondo */;

c [0; 37]error [16; 18]

decimal [4; 6]

comment [23; 36]

decimal [21; 22]

decimal [4; 6]

comment [7; ?]

Page 28: Implementazione di un motore per la colorazione della sintassi in GtkSourceView Relatore: Riccardo Sisto Candidati: Emanuele Aina Marco Barisione

Esempio di modifica del testoEsempio di modifica del testo

a = 42 /* primo */ + 1 /* secondo */;

c [0; ?]

c [0; 37]error [16; 18]

decimal [4; 6]

comment [23; 36]

decimal [21; 22]

decimal [4; 6]

comment [7; 18]

Page 29: Implementazione di un motore per la colorazione della sintassi in GtkSourceView Relatore: Riccardo Sisto Candidati: Emanuele Aina Marco Barisione

c [0; ?]

Esempio di modifica del testoEsempio di modifica del testo

a = 42 /* primo */ + 1 /* secondo */;

c [0; 37]error [16; 18]

decimal [4; 6]

comment [23; 36]

decimal [21; 22]

decimal [4; 6]

comment [7; 18]

Page 30: Implementazione di un motore per la colorazione della sintassi in GtkSourceView Relatore: Riccardo Sisto Candidati: Emanuele Aina Marco Barisione

c [0; ?]

Esempio di modifica del testoEsempio di modifica del testo

a = 42 /* primo */ + 1 /* secondo */;

c [0; 37]error [16; 18]

decimal [4; 6]

comment [23; 36]

decimal [21; 22]

decimal [4; 6]

comment [7; 18]

Page 31: Implementazione di un motore per la colorazione della sintassi in GtkSourceView Relatore: Riccardo Sisto Candidati: Emanuele Aina Marco Barisione

Esempio di modifica del testoEsempio di modifica del testo

a = 42 /* primo */ + 1 /* secondo */;

c [0; 37]comment [7; 18]

decimal [4; 6]

comment [23; 36]

decimal [21; 22]

Page 32: Implementazione di un motore per la colorazione della sintassi in GtkSourceView Relatore: Riccardo Sisto Candidati: Emanuele Aina Marco Barisione

ConclusioniConclusioni

Buone prestazioniBuone prestazioni Non si notano rallentamenti su macchine datateNon si notano rallentamenti su macchine datate

• Portatile PIII@450MHzPortatile PIII@450MHz

Descrizione dei linguaggi sempliceDescrizione dei linguaggi semplice Già realizzati: C, C++, JavaScript, HTML, XML, Già realizzati: C, C++, JavaScript, HTML, XML,

LaTeXLaTeX Supporto del vecchio formato di descrizione dei Supporto del vecchio formato di descrizione dei

linguaggilinguaggi

Page 33: Implementazione di un motore per la colorazione della sintassi in GtkSourceView Relatore: Riccardo Sisto Candidati: Emanuele Aina Marco Barisione

Sviluppi futuriSviluppi futuri

Supporto di nuovi linguaggiSupporto di nuovi linguaggi Test di uso reale in Gedit, MonoDevelop, MeldTest di uso reale in Gedit, MonoDevelop, Meld Integrazione nel ramo ufficiale e quindi in Integrazione nel ramo ufficiale e quindi in

GNOMEGNOME Eliminazione del vecchio motoreEliminazione del vecchio motore

Trasformazione dinamica del vecchio formato Trasformazione dinamica del vecchio formato mediante il foglio di stile XSLT già scrittomediante il foglio di stile XSLT già scritto

Page 34: Implementazione di un motore per la colorazione della sintassi in GtkSourceView Relatore: Riccardo Sisto Candidati: Emanuele Aina Marco Barisione