Algoritmo efficiente per l'aggiornamento di un albero di analisi


14

Diciamo che ho un grosso blocco di codice che ho già analizzato e analizzato.
Supponiamo che cambi solo un personaggio; Vorrei aggiornare il mio analisi, ma poiché la modifica è molto piccola rispetto all'intera cosa, vorrei sapere se è possibile non analizzare nuovamente l'intera cosa, ma se ci sono algoritmi per determinare l'intervallo da ripetere e per gestire correttamente lo spostamento dei confini dei token.

Grazie in anticipo!


1
Ciao e benvenuto! Non sono un esperto in materia, ma penso che la parola chiave che stai cercando sia l' analisi incrementale o la compilazione incrementale .
MS Dousti,

@Sadeq grazie per il puntatore! Considereresti di aggiungere una risposta con alcuni dettagli? Sarebbe molto apprezzato!
Agos,

Risposte:


9

Come da richiesta @Agos, ho trasformato il commento in una risposta.

Innanzitutto, devo ammettere che non sono davvero ben informato in questo campo. Tuttavia, ti suggerisco di leggere gli articoli Creazione di parser amichevoli e Analisi incrementale efficiente e flessibile per avere una visione di quali algoritmi sono stati utilizzati per l' analisi incrementale prima del 2000.

Per trattamenti aggiornati, puoi dare un'occhiata a questi documenti:

Ulteriori informazioni: esistono (almeno) due approcci per l'analisi / la compilazione:

  • L' approccio batch , in cui l'intero blocco di codice viene analizzato / compilato.
  • L' approccio incrementale , in cui il documento viene prima analizzato / compilato in modalità batch, quindi vengono rilevate le modifiche e viene applicato il minimo re-parsing / re-compilation. Questo approccio non solo aumenta la velocità di analisi / compilazione, ma aiuta anche nelle funzionalità intelligenti di IDE come la compilazione in background , che è correlata alla compilazione lazy . (Puoi anche cercare funzionalità commerciali come IntelliSense ).

1

se il parser incrementale salva lo stato a ciascuna estremità della riga, si analizza nuovamente solo dall'ultimo stato del parser valido (nella migliore delle ipotesi, ad esempio dopo un analisi completa, questo è solo l'inizio della riga in cui inizia la modifica) e si interrompe l'analisi alla fine della riga in cui termina la modifica (il parser interno potrebbe guardare oltre la modifica per riconoscere correttamente la struttura)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.