Sono nel mezzo della trasformazione di un normale tokenizzatore di riavvio completo (portato dal parser della lingua originale, la lingua è irrilevante qui) in uno incrementale più avanzato. Ciò implica quanto segue:Il modo migliore per salvare molte coppie di posizioni in Emacs Lisp
a) deve essere veloce, molto veloce;
b) su ogni aggiornamento di testo (sia esso inserimento o cancellazione) deve trovare i token danneggiati e riparare di conseguenza l'elenco dei token.
La versione originale del tokenizzatore crea semplicemente un elenco di token mentre scorre il testo del buffer utilizzando espressioni regolari; ogni token nella lista è un vettore di 4 elementi (['TOKENTYPE "token-lexeme" linum charnum]). Linum/charnum sono numeri semplici che specificano la posizione del token nel buffer nel momento in cui è stata eseguita la lexing. Torta facile
Ora, al punto. Ogni volta (beh .. non ogni volta, ma abbastanza spesso) un utente aggiunge o cancella un carattere (o una stringa) il nuovo tokenizzatore deve trovare un token costruito usando il testo in una posizione di modifica e, probabilmente, i token dipendenti per dopo delezioni/aggiornamenti.
Ci sono due problemi qui:
a) posizioni token dovrebbero essere dinamica (vale a dire, se un utente aggiunge un testo all'inizio di un buffer -> non dobbiamo disturbare i token di fissaggio alla fine del buffer);
b) un modo per raggiungere un token danneggiato (o molti token in generale).
In questo momento sto cercando di utilizzare le sovrapposizioni per l'attività poiché le sovrapposizioni hanno un'interfaccia piacevole che soddisfa le mie esigenze: le funzioni sovrapposizioni/sovrapposizioni aiutano la ricerca; e sovrapposizione inizio/fine spostamento in un modo appropriato.
Posso farlo felicemente per un file più piccolo. Ma si scopre (e devo ammettere che sono stato avvertito dai documenti) che la soluzione non è scalabile: anche un file LOC medio di 1K può avere overlay CONST * LOC, che è troppo per Emacs.
Questo è stato il mio primo tentativo e non è stato un successo. Sto considerando alternative come:
1) gestire un albero di ricerca di token scritto a mano usando numeri semplici;
2) stesso albero, ma utilizzando i marcatori;
3) un tipo di approccio misto che include sia numeri semplici che indicatori.
Qualsiasi alternativa agli approcci citati? O forse c'è un modo migliore per gestire un sacco di sovrapposizioni?
Correlati: Ci sono 'Wisent' e' semantic' in emacs. Probabilmente, hai già controllato quelli. È inoltre disponibile un supporto per l'evidenziazione, ad esempio: http://www.gnu.org/software/emacs/manual/html_mono/semantic.html#Highlight-Func-Mode. – Tobias
@Tobias Sì, certo, li ho controllati. Molte volte, in realtà, hanno persino firmato i documenti della FSF e inviato un micropatch o due per il codice relativo a Java. Questo particolare tokenizzatore ha lo scopo di funzionare in un modo diverso (si spera, superiore :-)) ed è più di un esperimento per sostituire la modalità di blocco dei caratteri. – Vlad