Ефективний алгоритм оновлення дерева розбору


14

Скажімо, у мене є великий блок коду, який я вже вилучив і проаналізував.
Припустимо, що змінюється лише один символ; Я хотів би оновити свій синтаксичний аналіз, але оскільки модифікація дуже мала в порівнянні з усією справою, я хотів би знати, чи можливо знову не проаналізувати всю цю справу, але якщо є алгоритми для визначення діапазону для повторного розбору та правильно поводитися з рухомими межами маркера.

Спасибі заздалегідь!


1
Привіт, і ласкаво просимо! Я не фахівець з цього питання, але я думаю, що ключове слово, яке ви шукаєте, - це покроковий аналіз або поступовий збір .
MS Dousti

@Sadeq дякую за вказівник! Чи можете ви додати відповідь з деякими подробицями? Було б дуже вдячно!
Agos

Відповіді:


9

Відповідно до запиту @Agos, я перетворив коментар у відповідь.

По-перше, я повинен визнати, що я не дуже обізнаний у цій галузі. Але я пропоную вам прочитати статті " Створення дружніх аналізаторів" та " Ефективний та гнучкий" інкрементальний аналіз, щоб мати уявлення про те, які алгоритми використовувалися для поступового розбору до 2000 року.

Для оновлених методів лікування ви можете ознайомитися з цими документами:

Більше інформації: Існує (принаймні) два підходи до розбору / складання:

  • Пакетний підхід, при якому весь блок коду аналізується / уклад.
  • Інкрементний підхід, при якому документ спочатку аналізується / скомпільовані в пакетному режимі, а потім зміни будуть виявлені і мінімальне повторне синтаксичний / повторне складання застосовується. Такий підхід не тільки збільшує швидкість розбору / компіляції, але й допомагає в чудових функціях IDE, таких як фонова компіляція , яка пов'язана з лінивою компіляцією . (Ви також можете шукати такі комерційні функції, як IntelliSense ).

1

якщо ваш інкрементальний аналізатор зберігає стан на кожному кінці рядка, ви повторно розбираєте тільки з останнього дійсного стану аналізатора (у кращому випадку, наприклад, після повного розбору це лише початок рядка, де починається модифікація) і зупиняєте розбір у кінці рядка, де модифікація закінчується (внутрішній аналізатор може визивати за межі модифікації, щоб правильно розпізнати структуру)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.