Come funziona la struttura dati della corda quando si esegue l'evidenziazione della sintassi

3

Sto esaminando la struttura dei dati su corda , utilizzato da alcuni editor di testo come editor xi .

Ho le basi su come funziona e ho visto alcune implementazioni di esempio come qui o qui . Ma sono confuso su come gestire correttamente (in modo ottimale) "l'aggiornamento" di una corda per evidenziare la sintassi. Sembra che funzioni nei seguenti passaggi.

  1. Si inizia con una stringa , non una corda, che è una matrice di caratteri contigui.
  2. Quindi lo converti in una corda, magari spezzando la stringa ogni 128 caratteri (ho visto quella raccomandazione da qualche parte). Quindi ora hai una corda di base, non sintassi evidenziata, che è solo un gruppo di blocchi di 128 caratteri concatenati insieme .
  3. Quindi in qualche modo converti questa corda in una corda evidenziata dalla sintassi.

Quindi è come se andassi da qui (l'albero "originale"):

        _ 1 _
      /       \
    2           5
  /   \       /   \
 3     4     6     7
 |     |     |      |
abc   xyz   foo    bar

Per qualcosa di simile, diciamo (l'albero "bersaglio"):

         _ 1 _
       /       \
     2           5
   /   \       /   \
  3     4     6     7
  |     |     |      |
 / \   xyz   foo    / \
R   G              B   R
|   |              |   |
a   bc             ba  r

dove R = rosso, G = verde, B = blu.

Cioè, alcuni nodi di "stile" extra sono stati inseriti per dare il colore delle lettere. Fondamentalmente semplice evidenziazione della sintassi per dimostrare la domanda.

Quindi la domanda è, come tratti i due alberi diversi. Sono confuso se si debba mantenere l'albero "originale" non modificato, quindi costruire un nuovo albero per la versione evidenziata della sintassi e in qualche modo mantenere una mappatura tra i due. O se dovessi semplicemente modificare l'albero originale per creare l'albero di destinazione direttamente da esso, così finirai con solo 1 albero invece di 2. Ma poi la parte difficile è se vuoi salvare la stringa in una forma evidenziata in unsintassi , devi ripetere costantemente l'albero di destinazione evidenziato dalla sintassi e rigenerare da esso un albero originale / di base / non evidenziato. Se si sta eseguendo la modifica del testo, significa che ogni file salvato dovrà iterare attraverso l'intera struttura evidenziata della sintassi, generare un nuovo albero e sovrascrivere il contenuto del file con i nuovi byte di base degli alberi. Che in qualche modo sembra inefficiente e mi sto confondendo nel pensare a cosa fare qui.

Un altro modo di vedere questo è se hai 2 o n viste che mostrano la stessa corda. Nella vista 1 si desidera evidenziare unsyntax e visualizzare 2 per evidenziare la sintassi. Non sono sicuro di cosa fare qui. Se hanno fatto riferimento alla stessa struttura di dati della corda, sembra che dovresti costruire un albero aggiuntivo per la versione evidenziata dalla sintassi separata dall'albero originale, quindi non ha danneggiato la struttura originale per la prima vista. Quindi sembra che ci debba essere una sorta di mappatura tra queste corde "derivate".

    
posta Lance Pollard 20.08.2018 - 16:28
fonte

1 risposta

1

A meno che non ci sia un altro requisito qui, non vedo alcuna necessità di tornare mai alla corda originale "non decorata". La corda, in base alla tua domanda, esiste solo per supportare queste decorazioni. Una corda non decorata è quindi una complicazione inutile.

Invece quello che devi fare è avere 2 (o più) routine per come trasformare l'albero in un output. Un convertitore camminerà sull'albero e terrà traccia delle decorazioni per visualizzarle nell'editor. L'altra versione ignorerà completamente le decorazioni e troverà semplicemente le foglie per concatenarle insieme per l'output non elaborato.

    
risposta data 20.08.2018 - 16:50
fonte

Leggi altre domande sui tag