Post on 01-May-2015
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
GtkSourceViewGtkSourceView
Widget di testo per GTK 2 con funzionalità Widget di testo per GTK 2 con funzionalità avanzate per la programmazioneavanzate per la programmazione
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");
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>
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
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
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
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
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
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>
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>
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
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"/>
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>
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
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
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>
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
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
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
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
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]
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]
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]
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]
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; ?]
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; ?]
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]
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]
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]
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]
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
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