Index

Analyse lexicale incrémentielle

Performance

Cette tâche consiste à réaliser une analyse partielle d'un texte source en utilisant le résultat d'une précédente analyse.
Finalité: Optimiser les performances du lexer pour un éditeur de texte.

Préambules

L'analyse lexicale

L'analyse lexicale retourne une structure (arborescente).
Chaque éléments de la structure ont les attributs :

Données de départ

Etapes générales

  1. Recherche de l'élément le plus profond à l'index indiquée
  2. Suppression au moins des éléments inclus dans l'intervalle effacé...
  3. Initialisation du scanner, détermination:
    1. de l'index et la ligne courante
    2. du token fin d'analyse = premier élément suivant les tokens éffacés
    3. de la pile des ancêtres
  4. Réalisation de l'analyse lexicale incrémentielle
  5. Mise à jour des valeurs du token fin d'analyse (concernant sa position dans le texte source), ainsi que celles des tokens suivants et des tokens ancêtres.
  6. Retour du résultat :
    • Ligne où débute les modifications
    • Ligne où finie les modifications (dans l'ancienne source)
    • Décalage de ligne = (nouveau-ancien) "nombre de ligne du texte source"

Principes

Recherche d'un élément à un index

On effectue une recherche dichotomique récursive depuis la racine de la structure lexicales.

Suppression des éléments

Au tout début de l'analyse est effacé:

Lors de la suppression d'un élément, son élément parent est effacé à la place, si celui-ci est :

Gestion du token fin analyse

Ce token change au token suivant si l'analyse le dépasse.
Si le lexer trouve un token identique alors :

Tokens identiques ?

On compare un token pas ajouté issu de l'analyse incrémentielle, à un token issu de l'analyse précédente.
Les valeurs de positionnement ne sont évidemment pas encore mise à jour dans l'ancienne analyse.
Est considéré identique les tokens ayant:

  • le même nom
  • la même valeur
  • le même index: on ajoute à l'index du token de l'ancienne analyse, le décalage en nombre caractère.
    Ce nombre est égal au nombre de caractère ajouté moins le nombre de caractère effacé.

Pour finir, on contrôle qu'ils auront bien le même parent.

Token suivant ?

  1. L'enfant suivant si il y en a un.
  2. Le token suivant le token parent sinon.
  3. ... et ainsi de suite.
  4. sinon il n'y en a pas une fois la racine atteinte.

On utilise le même principe pour le token précédant.

Mises à jour ?

Elles dépendent du décalage d'index et de ligne à appliquer, et du token fin analyse.

  • La seule valeur mise à jour pour les tokens ancêtres au token fin analyse est la ligne de fin.
  • Les valeurs mises à jour pour les tokens suivants sont l'index, la ligne de départ et de fin.
  • Si un token suivant est aussi un token parent, ses enfants sont mises à jour.