La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

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

Presentazioni simili


Presentazione sul tema: "Implementazione di un motore per la colorazione della sintassi in GtkSourceView Relatore: Riccardo Sisto Candidati: Emanuele Aina Marco Barisione."— Transcript della presentazione:

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

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

3 Limiti del motore attuale Impossibilità di gestire strutture annidate Impossibilità di gestire strutture annidate #if 0 # if A # endif #endif nessuna colorazione #if 0 // FIXME: commento printf ("hello \n world"); // FIXME: commento printf ("hello \n world");

4 Limiti del motore attuale JavaScript dentro HTML: JavaScript dentro HTML: if (a<b) language = "stringa"; variabile = "stringa"; if (a<b) language = "stringa"; variabile = "stringa";

5 Obiettivi Gestire costrutti complessi Gestire costrutti complessi Linguaggi all'interno di altri linguaggi (JavaScript in HTML) Linguaggi all'interno di altri linguaggi (JavaScript in HTML) Semplicità nella descrizione dei linguaggi Semplicità nella descrizione dei linguaggi Non deve essere necessario programmare Non deve essere necessario programmare Buone prestazioni Buone prestazioni Nell'uso interattivo non devono essere visibili rallentamenti Nell'uso interattivo non devono essere visibili rallentamenti

6 Tecnologie esistenti Colorer Colorer Eccessiva complessità Eccessiva complessità Kate Kate Esposizione dellimplementazione nelle descrizioni dei linguaggi Esposizione dellimplementazione nelle descrizioni dei linguaggi Scintilla Scintilla Necessità di scrivere un lexer in C per ogni linguaggio Necessità di scrivere un lexer in C per ogni linguaggio VIM VIM Descrizioni basate su un motore di scripting Descrizioni basate su un motore di scripting Lanalisi è eseguita solo su una porzione del testo Lanalisi è eseguita solo su una porzione del testo

7 Nuovo motore: annidamenti Corretta gestione di strutture annidate Corretta gestione di strutture annidate #if 0 # if A # endif #endif nessuna colorazione #if 0 #if A

8 Nuovo motore: contesti Contesto: porzione di testo con significato sintattico Contesto: porzione di testo con significato sintattico Esempi: commenti, stringhe o parole chiave Esempi: commenti, stringhe o parole chiave Espressioni regolari Espressioni regolari Flessibilità nel riconoscimento di porzioni di testo Flessibilità nel riconoscimento di porzioni di testo Impossibilità di riconoscere costrutti complicati Impossibilità di riconoscere costrutti complicati Mancanza di ricorsività Mancanza di ricorsività Regolano le transizioni fra un contesto e l'altro Regolano le transizioni fra un contesto e l'altro

9 XML Standard W3C Standard W3C Estensibile Estensibile Il significato degli elementi è definito dallo sviluppatore Il significato degli elementi è definito dallo sviluppatore Ampia diffusione e supporto Ampia diffusione e supporto Validazione automatica Validazione automatica DTD DTD Schema Schema Relax NG Relax NG

10 Contesti semplici Non contengono sotto-contesti Non contengono sotto-contesti Identificati da un'unica espressione regolare Identificati da un'unica espressione regolare ^#include ".*?" ^#include ".*?" </context>

11 Contesti contenitore Delimitati da un'espressione regolare di inizio e da una di fine Delimitati da un'espressione regolare di inizio e da una di fine " " \\. \\.

12 Contesti keyword Lista di parole chiave Lista di parole chiave for for if if […] […]</context> Internamente sono contesti semplici Internamente sono contesti semplici

13 Contesti sub-pattern Non sono veri contesti Non sono veri contesti Identificano una porzione di un'espressione regolare Identificano una porzione di un'espressione regolare Corrispondono ad un "sub-pattern" di una espressione regolare Corrispondono ad un "sub-pattern" di una espressione regolare Numerati a partire da 1 Numerati a partire da 1 Possono essere contenuti in contesti semplici Possono essere contenuti in contesti semplici #include ("[^"]*") #include ("[^"]*")

14 Estensione dei contesti I contesti possono estendere il genitore I contesti possono estendere il genitore Non sempre è ciò che si vuole Non sempre è ciò che si vuole Attributo extend-parent del tag Attributo extend-parent del tag "hello \" world" escape string // Commento

15 Stili Separazione tra presentazione e descrizione Separazione tra presentazione e descrizione Nome visibile all'utente Nome visibile all'utente Associazione a stili predefiniti Associazione a stili predefiniti <style id="comment" name="Comment" name="Comment" map-to="def:comment"/> map-to="def:comment"/> Associazione dello stile al contesto con l'attributo style-ref Associazione dello stile al contesto con l'attributo style-ref Più contesti possono usare lo stesso stile Più contesti possono usare lo stesso stile

16 Riuso del codice Definire espressioni regolari usate frequentemente Definire espressioni regolari usate frequentemente Tag Tag Riferimento all'espressione regolare con \%{nome} Riferimento all'espressione regolare con \%{nome} Riferimento a contesti già definiti (attributo ref ) Riferimento a contesti già definiti (attributo ref ) Più contesti contengono lo stesso sotto-contesto Più contesti contengono lo stesso sotto-contesto Importazione di altre descrizioni Importazione di altre descrizioni C++ aggiunge solo alcune keyword al C C++ aggiunge solo alcune keyword al C def.lang contiene alcune definizioni comuni def.lang contiene alcune definizioni comuni

17 Analisi Viene analizzata una riga per volta Viene analizzata una riga per volta Ad ogni carattere si verifica se vi è una transizione dal contesto corrente verso un altro contesto Ad ogni carattere si verifica se vi è una transizione dal contesto corrente verso un altro contesto Contesti contenitore Contesti contenitore Il motore entra nel contesto quando trova l'espressione iniziale in Il motore entra nel contesto quando trova l'espressione iniziale in Il motore esce dal contesto quando trova l'espressione finale in Il motore esce dal contesto quando trova l'espressione finale in Contesti semplici Contesti semplici Il motore si sposta dopo la corrispondenza in Il motore si sposta dopo la corrispondenza in

18 if-in-if0 Esempio di analisi #if 0 # if A # endif #endif /* […] * FIXME * FIXME * […] * […] */ */ cif0if-in-if0 commentfixme if0 fixme comment Stato corrente: c

19 Albero degli stati L'insieme degli stati per ogni posizione nel testo è rappresentato da un albero L'insieme degli stati per ogni posizione nel testo è rappresentato 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 è: c if0

20 Accelerazione dell'analisi Ricerca delle corrispondenze ancorata o meno Ricerca delle corrispondenze ancorata o meno Prima implementazione: Prima implementazione: Per ogni carattere provate tutte le possibili transizione Per ogni carattere provate tutte le possibili transizione Seconda implementazione: Seconda implementazione: Fusione di tutte le possibili transizioni in un'unica espressione regolare Fusione di tutte le possibili transizioni in un'unica espressione regolare Suddivisione in due fasi: Suddivisione in due fasi: Ricerca della posizione della prima transizione Ricerca della posizione della prima transizione Ricerca della destinazione della transizione Ricerca della destinazione della transizione Miglioramento di un ordine di grandezza Miglioramento di un ordine di grandezza

21 Modifiche al testo Non è possibile rianalizzare l'intero file ad ogni modifica Non è possibile rianalizzare l'intero file ad ogni modifica Riciclare i contesti presenti prima della modifica Riciclare i contesti presenti prima della modifica I contesti che precedono la riga modificata vengono riciclati così come sono I contesti che precedono la riga modificata vengono riciclati così come sono La riga viene rianalizzata La riga viene rianalizzata Quando lo stato vecchio e quello nuovo coincidono si possono riciclare tutti i contesti successivi Quando lo stato vecchio e quello nuovo coincidono si possono riciclare tutti i contesti successivi

22 Esempio di modifica del testo a = 42 / primo */ + 1 /* secondo */; c [0; 36] error [15; 17] decimal [4; 6] comment [22; 35] decimal [20; 21]

23 Esempio 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]

24 c [0; ?] Esempio di modifica del testo a = 42 /* primo */ + 1 /* secondo */; c [0; 37] error [16; 18] decimal [4; 6] comment [23; 36] decimal [21; 22]

25 c [0; ?] Esempio 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]

26 c [0; ?] Esempio 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; ?]

27 c [0; ?] Esempio 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; ?]

28 Esempio 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]

29 c [0; ?] Esempio 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]

30 c [0; ?] Esempio 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]

31 Esempio di modifica del testo a = 42 /* primo */ + 1 /* secondo */; c [0; 37] comment [7; 18] decimal [4; 6] comment [23; 36] decimal [21; 22]

32 Conclusioni Buone prestazioni Buone prestazioni Non si notano rallentamenti su macchine datate Non si notano rallentamenti su macchine datate Portatile PIII@450MHz Portatile PIII@450MHz Descrizione dei linguaggi semplice Descrizione dei linguaggi semplice Già realizzati: C, C++, JavaScript, HTML, XML, LaTeX Già realizzati: C, C++, JavaScript, HTML, XML, LaTeX Supporto del vecchio formato di descrizione dei linguaggi Supporto del vecchio formato di descrizione dei linguaggi

33 Sviluppi futuri Supporto di nuovi linguaggi Supporto di nuovi linguaggi Test di uso reale in Gedit, MonoDevelop, Meld Test di uso reale in Gedit, MonoDevelop, Meld Integrazione nel ramo ufficiale e quindi in GNOME Integrazione nel ramo ufficiale e quindi in GNOME Eliminazione del vecchio motore Eliminazione del vecchio motore Trasformazione dinamica del vecchio formato mediante il foglio di stile XSLT già scritto Trasformazione dinamica del vecchio formato mediante il foglio di stile XSLT già scritto

34


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

Presentazioni simili


Annunci Google