Algoritma yang efisien untuk memperbarui pohon parse

14

Katakanlah saya memiliki blok kode besar yang sudah saya lex dan parsing.
Misalkan hanya satu karakter yang berubah; Saya ingin memperbarui penguraian saya, tetapi karena modifikasinya sangat kecil dibandingkan dengan semuanya, saya ingin tahu apakah mungkin untuk tidak menguraikan semuanya lagi, tetapi jika ada algoritma untuk menentukan kisaran untuk mengurai kembali , dan untuk menangani dengan benar batas token yang bergerak.

Terima kasih sebelumnya!

Lalu
sumber
1
Hai, dan selamat datang! Saya bukan ahli dalam hal ini, tetapi saya pikir kata kunci yang Anda cari adalah parsing inkremental atau kompilasi tambahan .
MS Dousti
@Sadeq terima kasih atas penunjuknya! Apakah Anda ingin menambahkan jawaban dengan beberapa detail? Itu akan sangat dihargai!
Agos

Jawaban:

9

Sesuai permintaan @Agos, saya mengubah komentar menjadi jawaban.

Pertama, saya harus mengakui bahwa saya tidak benar-benar berpengetahuan di bidang ini. Namun saya sarankan Anda membaca makalah Membangun parser ramah dan Parsing Incremental Efisien dan Fleksibel untuk memiliki pandangan tentang algoritma apa yang digunakan untuk parsing inkremental sebelum tahun 2000.

Untuk perawatan terbaru, Anda dapat melihat makalah ini:

Info lebih lanjut: Ada (setidaknya) dua pendekatan untuk parsing / kompilasi:

  • The Batch pendekatan, di mana seluruh blok kode parsing / disusun.
  • The inkremental pendekatan, di mana dokumen tersebut pertama parsing / disusun dalam modus batch, dan kemudian ada perubahan terdeteksi dan minimal re-parsing / re-kompilasi diterapkan. Pendekatan ini tidak hanya meningkatkan kecepatan parse / kompilasi, tetapi juga membantu dalam fitur IDE yang bagus seperti kompilasi latar belakang , yang terkait dengan kompilasi malas . (Anda juga dapat mencari tentang fitur komersial seperti IntelliSense ).
MS Dousti
sumber
1

jika parser inkremental Anda menyimpan status di setiap ujung baris, Anda menguraikan ulang hanya dari kondisi parser yang valid terakhir (paling tidak, misalnya setelah parser penuh, ini hanya permulaan baris di mana modifikasi dimulai) dan berhenti mengurai di akhir garis di mana modifikasi berakhir (parser internal mungkin melihat ke depan di luar modifikasi untuk mengenali struktur dengan benar)


sumber