Побудова LL(k)-синтаксичного аналізатора (k>1)

Повернемось до умови, при якій граматика G буде LL(k)-граматикою, а саме: для довільного виводу:

Оскільки - конструктивна множина, спробуємо побудувати всілякі множини L, які задовольняють попередньо сформульованій умові.

Означення. Множина

Алгоритм. Пошук множини

П0:

в інших випадках - невизначено.

П1:

в інших випадках - невизначено.

…. ….. ……

Пn:

в інших випадках - невизначено.

…. …. ….

Пm:

Тоді .

Виходячи з означення , умови для LL(k)-граматики будуть наступними: для довільного А-правила виду:

Як наслідок, з алгоритму пошуку видно, що

Для побудови синтаксичного аналізатора для LL(k)-граматики (k>1) необхідно побудувати множину таблиць, що забезпечать нам безтупиковий аналіз вхідного ланцюжка w (програми) за час пропорційний О(n), де n=| w |.

Побудову множини таблиць для управління LL(k)-аналізатором почнемо з таблиці, яка визначає перший крок безпосереднього виводу w в граматиці G:

Неформально, коли в магазині автомата знаходиться аксіома S, то нас цікавить перших k термінальних символів, які можна вивести з S (аксіома - поняття "програма") при умові, що після неї (програми) буде досягнуто EOF.

Імена інших таблиць Т1, Т2, … Тp визначаються так:

Наступні таблиці визначаються так:

Наступні таблиці визначаються так:

Виходячи з вищенаведеної побудови множини таблиць управління LL(k)-синтаксичним аналізатором видно, що для нетермінала Аi множина таблиць буде наступна:

Приклад. Побудувати множину таблиць управління для LL(2)-граматики з наступною схемою правил:

Для вищенаведеної граматики множини будуть такі:

,

а множини .

Побудуємо першу таблицю Для S-правила відповідні множини u будуть такі:

Таблиця T0 визначається так:

aa ab ba bb a b
         

Нова таблиця управління Для A-правила відповідні множини u будуть такі:

aa ab ba bb a b
       

Нова таблиця управління Для таблиці та S-правила множини u будуть такі:

aa ab ba bb a b
         

Наступна таблиця Для таблиці та A-правила множини u будуть такі:

aa ab ba bb a b
       

Нова таблиця

Ми визначили чотири таблиці-рядки (а їх кількість для довільної LL(k)-граматики визначається так:

Об'єднаємо рядки-таблиці в єдину таблицю та виконаємо перейменування рядків:

aa ab ba bb a b
         
       
         
       

 

Алгоритм. Синтаксичний аналізатор для LL(k)-граматики (k>1).

П0: Прочитати k лексем з вхідного файла програми (звичайно, інколи менше ніж k). В магазин занести таблицю Т0.

…. ….

Пi: - Якщо на вершині магазина знаходиться таблиця Ti, то елемент таблиці М(Тi, <k-вхідних лексем>) визначає ланцюжок, який Ti заміщає на вершині магазина.

- Якщо на вершині магазина і перша поточна лексема з k прочитаних лексем рівна , то з вершини магазина зняти та прочитати з вхідного файла додатково одну лексему (звичайно, якщо це можливо).

- Якщо досягли кінця вхідного файла програми та магазин порожній, то програма не має синтаксичних помилок.

- В інших випадках - синтаксична помилка.