2011-08-30 16 views
9

Ho sviluppato un evidenziatore di sintassi in Java per Android e funziona bene, ma il problema è che può essere lento con file di grandi dimensioni.Evidenziazione della sintassi: in che modo Eclipse lo fa così velocemente?

Quindi mi chiedo come gli editor di codice sorgente come Eclipse e Gedit (Ubuntu) evidenziano ciò che hai appena scritto così rapidamente. Ad esempio, se si immette il finale più grande del simbolo quando si scrive un tag HTML, esso evidenzia immediatamente il tag.

Com'è così veloce, anche con file di grandi dimensioni? Esiste un modo specifico in cui lo fanno o eseguono semplicemente l'evidenziazione della sintassi per la linea in cui ci si trova?

Grazie, Alex

+2

Immagino che memorizzi e mostri solo ciò che vedi nella vista, non il resto invisibile del codice. – BalusC

risposta

33

Non posso parlare per Gedit, ma in Eclipse, abbiamo imbrogliare :-)

Se si guarda con molta attenzione, si può effettivamente vedere che la colorazione della sintassi per i linguaggi strutturati come Java è un processo a due fasi.

In primo luogo, viene eseguito un riconciliazio- natore di presentazioni per eseguire la colorazione della sintassi molto semplice. Questo viene fatto immediatamente attivato sulle modifiche nel documento dell'editor e dovrebbe essere estremamente veloce. Non è in realtà la colorazione basata sulla sintassi della sintassi , ma in realtà è in forma lessicale. Quindi il focus è su token come stringhe, parole chiave, parole, numeri, commenti, ecc. - tutti i token che possono essere riconosciuti facilmente sulla base di tabelle di caratteri semplici o simili. Quindi non ci sono differenze tra un nome di classe, un nome di variabile o un nome di metodo statico, anche se possono essere colorati in modo diverso alla fine. Per molte lingue, questa è l'unica colorazione eseguita.

Successivamente, un riconciliatore di sintassi viene eseguito per creare un albero di sintassi astratto (AST) per il documento o il più vicino possibile a fronte di errori di sintassi o errori semantici. Questo viene attivato da un timer e per alcune lingue viene effettuato un tentativo di solo fare un aggiornamento parziale dell'AST (non facile). L'AST completato viene quindi utilizzato per aggiornare la vista struttura e quindi eseguire ulteriore colorazione della sintassi in base alle informazioni aggiuntive, ad es. nome del metodo statico. (L'AST è spesso usato per molte altre cose, come hover information, folding, hyperlinking, ecc.

Sia per il riconciliamento di presentazione iniziale che per il riconciliamento basato sulla sintassi successiva, alcune logiche piuttosto elaborate determinano quanto grande sia una regione del documento che deve essere analizzato.Per la riconciliazione della presentazione la decisione può essere basata su qualsiasi colorazione esistente, mentre per la colorazione basata sulla sintassi una fase separata di riparazione/danneggiamento in esecuzione per determinare la dimensione della regione

Alcuni esempi estremi che sempre complicare le cose sono quando i commenti di blocco vengono aggiunti o rimossi

a = b /* c + 1 /* remember the offset! */; 

Se la prima barra viene rimossa o aggiunta, il riconciliatore di presentazione deve elaborare un'area più ampia di quanto possa essere ingenuamente previsto ...

Problemi correlati