Effizienter Algorithmus zum Aktualisieren eines Analysebaums

14

Angenommen, ich habe einen großen Codeblock, den ich bereits lexiert und analysiert habe.
Angenommen, nur ein Zeichen ändert sich. Ich möchte mein Parsing aktualisieren, aber da die Änderung im Vergleich zum Ganzen sehr gering ist, möchte ich wissen, ob es möglich ist, das Ganze nicht noch einmal zu analysieren, sondern ob es Algorithmen gibt, um den zu analysierenden Bereich zu bestimmen , und richtig mit dem Verschieben von Token-Grenzen umzugehen.

Danke im Voraus!

Agos
quelle
1
Hallo und herzlich willkommen! Ich bin kein Experte auf diesem Gebiet, aber ich denke, das Schlüsselwort, nach dem Sie suchen, ist inkrementelles Parsen oder inkrementelle Kompilierung .
MS Dousti
@Sadeq danke für den Zeiger! Möchten Sie eine Antwort mit einigen Details hinzufügen? Es wäre sehr dankbar!
Agos

Antworten:

9

Laut @Agos-Anfrage habe ich den Kommentar in eine Antwort umgewandelt.

Zunächst muss ich zugeben, dass ich mich auf diesem Gebiet nicht wirklich auskenne. Ich schlage jedoch vor, Sie lesen die Artikel Erstellen von benutzerfreundlichen Parsern und Effizientes und flexibles inkrementelles Parsing , um zu sehen, welche Algorithmen vor 2000 für inkrementelles Parsing verwendet wurden .

Informationen zu aktualisierten Behandlungen finden Sie in den folgenden Dokumenten:

Weitere Informationen: Es gibt (mindestens) zwei Ansätze zum Parsen / Kompilieren:

  • Der Batch- Ansatz, bei dem der gesamte Codeblock analysiert / kompiliert wird.
  • Der inkrementelle Ansatz, bei dem das Dokument zuerst im Stapelmodus analysiert / kompiliert wird und dann Änderungen erkannt werden und das minimale erneute Analysieren / erneute Kompilieren angewendet wird. Dieser Ansatz erhöht nicht nur die Geschwindigkeit beim Parsen / Kompilieren, sondern hilft auch bei raffinierten IDE-Funktionen wie der Hintergrundkompilierung , die mit der verzögerten Kompilierung zusammenhängt . (Sie können auch nach kommerziellen Funktionen wie IntelliSense suchen .)
MS Dousti
quelle
1

Wenn Ihr inkrementeller Parser den Status an jedem Zeilenende speichert, wird der aktuelle Parser-Status erneut analysiert (im besten Fall, z. B. nach einer vollständigen Analyse, ist dies nur der Zeilenanfang, an dem die Änderung beginnt) und die Analyse wird am Ende beendet der Zeile, in der die Änderung endet (der interne Parser kann über die Änderung hinaus nach vorne schauen, um die Struktur richtig zu erkennen)


quelle