Algorithme efficace pour mettre à jour un arbre d'analyse

14

Disons que j'ai un gros bloc de code que j'ai déjà lexé et analysé.
Supposons qu'un seul caractère change; Je voudrais mettre à jour mon analyse, mais comme la modification est très petite par rapport à l'ensemble, je voudrais savoir s'il est possible de ne pas analyser à nouveau l'ensemble, mais s'il existe des algorithmes pour déterminer la plage à ré-analyser et pour gérer correctement le déplacement des limites des jetons.

Merci d'avance!

Agos
la source
1
Salut et bienvenue! Je ne suis pas un expert en la matière, mais je pense que le mot-clé que vous recherchez est l' analyse incrémentielle ou la compilation incrémentielle .
MS Dousti
@Sadeq merci pour le pointeur! Envisageriez-vous d'ajouter une réponse avec quelques détails? Ce serait grandement apprécié!
Agos

Réponses:

9

Conformément à la demande @Agos, j'ai transformé le commentaire en réponse.

Tout d'abord, je dois admettre que je ne suis pas vraiment bien informé dans ce domaine. Pourtant, je vous suggère de lire les articles Construire des analyseurs conviviaux et une analyse incrémentielle efficace et flexible pour avoir une vue des algorithmes utilisés pour l' analyse incrémentielle avant 2000.

Pour des traitements mis à jour, vous pouvez consulter ces articles:

Plus d'informations: Il existe (au moins) deux approches d'analyse / compilation:

  • le approche par lots , dans laquelle l'ensemble du bloc de code est analysé / compilé.
  • L' approche incrémentale , dans laquelle le document est d'abord analysé / compilé en mode batch, puis les modifications sont détectées et la nouvelle analyse / recompilation minimale est appliquée. Cette approche augmente non seulement la vitesse d'analyse / de compilation, mais aide également les fonctionnalités astucieuses d'IDE telles que la compilation en arrière-plan , qui est liée à la compilation paresseuse . (Vous pouvez également rechercher des fonctionnalités commerciales telles que IntelliSense ).
MS Dousti
la source
1

si votre analyseur incrémental enregistre l'état à chaque fin de ligne, vous ré-analysez uniquement à partir du dernier état d'analyseur valide (dans le meilleur des cas, par exemple après une analyse complète, ce n'est que le début de la ligne où la modification commence) et arrêtez l'analyse à la fin de la ligne où se termine la modification (l'analyseur interne peut regarder au-delà de la modification pour reconnaître correctement la structure)


la source