Визначення LL (k)-граматик.
b> Для початку припустимо, що G b> = ( N b>, E b>, P b>, S b>) - однозначна граматика і w = a1, a2 ... an - ланцюжок з L b> ( G b>). Тоді існує єдина послідовність левовиводімих ланцюжків b0, b1 .. bm, для якої S b> = b0, bi, pi Ю bi 1 при 0 <= i
Припустимо, що ми хочемо знайти цей лівий розбір, переглядаючи w один раз зліва направо. Можна спробувати зробити це, будуючи послідовність левовиводімих ланцюжків b0, b1 .. bm. Якщо bi = a1, a2 ... ajAB, то до даного моменту аналізу ми вже прочитали першими j вхідних символів і порівняли їх з першими j символами ланцюжка bi. Було б бажано визначити bi 1, знаючи тільки a1, a2 ... aj (частина вхідний ланцюжки, зчитану до даного моменту), кілька наступних вхідних символів (aj 1 aj +2 ... aj + k для деякого фіксованого k) і нетермінал A. Якщо ці три чинники однозначно визначають, яке правило треба застосувати для розгорнення нетермінала A, то ai +1 точно визначається за ai і k вхідним символам aj 1 aj +2 ... aj + k.
Граматика, в якій кожен лівий висновок, має таку властивість, називається LL b> (k)-граматикою. Ми побачимо, що для кожної LL b> (k) - граматики можна побудувати детермінований лівий аналізатор, що працює лінійний час. Дамо кілька визначень: ОПР: b> Нехай a = xb така левовиводімая ланцюжок у граматиці G b> = ( N b>, E b>, P b>, S b>), що xОE *, а b або починається нетерміналом, або порожній ланцюжок. Будемо називати x закінченою частиною ланцюжка a, а b - незакінченою частиною частиною. Кордон між x і b будемо називати кордоном. ПЗМ: b> Нехай x = abacAaB, тоді abac - закінчена частина ланцюжка x, AaB - незакінчена частину ланцюжка. Якщо x = abc, то abc - закінчена частина і е - незакінчена і кордоном служить кінець ланцюжка.
Іншими словами ідею LL b> (k) - граматики можна пояснити так: якщо є вже розібрана частина ланцюжка, то на підставі цього і ще декількох нерозібраних символів ми можемо зробити висновок про те, яке правило неоюходімо застосувати. Таким чином граматика посуществу не залежить (не рахуючи k наступних символів) від того, що виводиться з незакінченою частини ланцюжка. У термінах дерев цей процес виглядає наступним чином: дерево виводу ланцюжка будується починаючи з кореня і детерміновано зверху вниз.
Вводять функцію FIRST (x) - повертає перший k символів. Зазвичай приписують в якості індексів k і G b> - кількість символів і граматика відповідно, але їх можна опускати, якщо це не викличе непорозумінь. ОПР: b> KC-граматика G b> = ( N b>, E b>, P b>, < b> S b>) називається LL b> (k)-граматикою для деякого фіксованого k, якщо з існування двох лівих висновків
(1) S b> Юw Aa ` b> Ю wb` a ` b> Юwx S b> Юw Aa ` b> Ю wc` a ` b> Юwy
для яких FIRST ( x b>) = FIRST ( y b>), випливає що b ` b> = c` b>.
Інакше це визначення виражає те, що для наявної ланцюжка і знаючи наступні k символів можна застосувати не більше одного правила виводу. Граматика називається LL b> - граматикою, якщо вона LL b> (k) - граматика для деякого k. ПЗМ: b> Хай G b> складається з правил S b> ® aAS b> | b b>, A b> ® a b> | bSA b>. Інтуїтивно G b> є LL b> (1) - граматикою, тому що, якщо дан найлівіший нетермінал С b> у левовиводімой ланцюжку і наступний вхідний символ с b>, існує не більше одного правила, що застосовується до С b> і що приводить до термінальної ланцюжку, що починається символом с b>. Переходячи до визначення LL b> (1) - граматики, ми бачимо, що якщо S b> Ю wSa ` b> Ю wb` a ` b> Ю wx b> і S b> Ю wSa ` b> Ю wc` a ` b> Ю wy b > та ланцюжки x b> і y b> починаються одним і тим же символом, то має бути b ` b> = c` b>. В даному випадку якщо x b> і y b> починаються символом a b>, то у висновку брало участь правило S b> ® aAS b> і b ` b> = c` b> = aAS b>. Альтернатива S b> ® b b> тут неможлива. З іншого боку, якщо x b> і y b> починаються з b b>, то має застосовуватися правило S b> ® b b> і b ` b> = c` b> = b b>. Зауважимо, що випадок x b> = y b> = e тут неможливий, так як з S b> у граматиці G b> не виводиться e .
Коли розглядаються два висновки S b> Ю wAa ` b> Ю wc` a ` b> Ю wy b> міркування аналогічно. Граматика G b> є прикладом так званої простої LL b> (1) - граматики (або розділеної граматики). ОПР: b> КС-граматика G b> = ( N b>, E b>, P b>, < b> S b>) без e-правил називається простий LL b> (k) - граматикою (або розділеної граматикою), якщо для кожного A b> Про N всі його альтернативи починаються різними термінальними символами.
Пророкує алгоритми розбору.
b> Розбір для LL b> (k)-граматики дуже зручно здійснювати за допомогою так званого k-який пророкує алгоритму розбору. k-який пророкує алгоритм використовує вхідну стрічку, магазин і вихідну стрічку. Алгоритм намагається простежити висновок ланцюжка, збережені на його вхідний стрічці. При читанні аналізованої ланцюжка вхідна головка може "заглядати" вперед на чергові k символу. Ці символи називають аванцепочкой. Алгоритм має конфігурацію що представляється трійкою (x, Xa, n b>), де
x - невикористана частина вхідний ланцюжка
Xa - ланцюжок у магазині і Х - верхній символ n b> - ланцюжок на вихідний стрічці
Роботою k-який пророкує алгоритму керує керуюча таблиця, яка задає відповідність між безліччю
((верхній символ магазину) Х (аванцепочка))
і безліччю
((права частина правила і його номер) | помилка | викид | допуск).
Алгоритм є коректним для граматики, якщо для будь-якої ланцюжка з цієї граматики алгоритм дозволяє отримати впорядкований список правил для її розбору. Якщо роботою якогось алгоритму керує якась таблиця і цей алгоритм виявляється коректним для даної граматики, то таблицю називають коректною. ПЗМ: b>
Нехай дана граматика з правилами: S b> ® aAS b> S b> ® b b> A b> ® a b> A b> ® bSA b>
Для такої граматики буде побудована таблиця:
аванцепочка a b>
b b>
e
верхній
S b>
aAS, 1 b>
b, 2 b>
помилка
символ
A b>
a, 3 b>
bSA, 4 b>
помилка
магазину
a b>
викид
помилка
помилка
b b>
помилка
викид
помилка
$ b>
помилка
помилка
допуск
За такої таблиці буде проведений аналіз:
( abbab b>, S $, b> e) | - ( abbab b>, aAS $, 1 b>) bbab b>, AS $, 1 b>) bbab b>, bSAS $, 14 b>) bab b>, SAS $, 14 b>) bab b>, bAS $, 142 b>) ab b>, AS $, 142 b>) ab b>, aS $, 1423 b>) b b>, S $, 1423 b>) b b>, b $, 14232 b>) b> e, $, 14232 b>)
k-який пророкує алгоритм розбору КС-граматики G b> можна моделювати на детермінованому МП-перетворювачі з кінцевим маркером на вхідних стрічці. Так як вхідна головка МП-перетворювача може оглянути тільки один вхідний символ, аванцепочка повинна зберігатися в кінцевій пам'яті керуючого пристрою. Інші деталі моделювання очевидні. ТРМ: b> Хай А b> - k-який пророкує алгоритм розбору для КС-граматики G b>. Тоді існує такий детермінований МП-перетворювач, який дозволяє розібрати будь-яку ланцюжок з цієї граматики. Інакше кажучи можна промоделювати будь-який алгоритм на зазначеному перетворювачі. СЛВ: b> Хай А b> - k-який пророкує алгоритм розбору для КС-граматики G b>. Тоді для G b> існує детермінований лівий аналізатор.
Наслідки визначення LL (k)-граматики.
b> Покажемо що для кожної LL (k) b> граматики можна механічно побудувати коректний k-який пророкує алгоритм розбору. Так як ядром алгоритму є управляюча таблиця, треба показати, як будувати з граматики таку таблицю. Для цього виведемо деякі слідства визначення LL b> (k) - граматики.
У визначенні LL b> (k) - граматики стверджується, що для даної що виводиться ланцюжка wA a b> ланцюжок w і безпосередньо наступні за нею k вхідних символів однозначно визначають, яку застосувати правило для розгорнення нетермінала A. Тому на перший погляд може здатися, що для визначення потрібного правила треба пам'ятати весь ланцюжок w. Однак це не так. Доведемо теорему, дуже важливу для розуміння LL b> (k)-граматик: ТРМ: b> КС-граматика G b> = ( N b>, E b>, P b>, < b> S b>) є LL b> (k)-граматикою тоді і тільки тоді, коли для двох різних правил A b> ® b ` b> і A b> ® c ` b> з P b> перетин FIRST ( b` a ` b>) ЗFIRST ( c` a ` b>) пусто для всіх таких wA a` b>, що S b> ЮwA a ` b>. ДКВ: b> Необхідність. Припустимо, що w, A, a ` b>, b` b> і c ` b> задовольняють умовам теореми, а FIRST ( b` a ` b>) ЗFIRST ( c `a` b>) містить x. Тоді за визначенням FIRST для деяких y і z знайдуться висновки S b> ЮwA a ` b> Юw b` a ` b> Юwxy і S b > ЮwA a ` b> Юw c` a ` b> Юwxz. (Зауважимо, що тут ми використали той факт, що N b> не містить марних терміналів, як це передбачається для всіх розглянутих граматик.) Якщо | x | b ` b> № c` b>, то G b> не LL b> (k) - граматика.
Достатність. Припустимо, що G не LL (k) - граматика. Тоді знайдуться такі два висновки S b> ЮwA a ` b> Юw b` a ` b> Юwx і S b> ЮwA a ` b> Юw c` a ` b> Юwy, що ланцюжки x і y збігаються в першу k позиціях, але b` b> № c ` b> . Тому A ® b ` b> і A ® c` b> - різні правила з P і кожне з множин FIRST ( b `a` b>) та FIRST ( c `a` b>) містить ланцюжок FIRST (x) збігається з FIRST (y). ЧТД b>. ПЗМ: b> Граматика G b> з правила S b> ® a S b> | a, не буде LL b > (1) - граматикою, тому що FIRST1 (a S b>) = FIRST1 (a) = a. Це можна пояснити так - бачачи тільки перший символ ланцюжка ми не можемо визначити який правило необхідно застосувати (ліве або праве). З іншого боку ця граматика є LL2 (k) граматикою - що цілком очевидно. ОПР: b> Хай G b> = ( N b>, E b>, P b>, S b>) - КС-граматика. Визначимо FOLLOWk ( b ` b>) як множина термінальних символів, які можуть зустрічатися після нетемінала, що є аргументом функції. ТРМ: b> КС-граматика G b> = ( N b>, E b>, P b>, < b> S b>) є LL b> (1)-граматикою тоді і тільки тоді, коли для двох різних правил A b> ® b ` b> і A b> ® c ` b> перетин FIRST1 ( b` b> FOLLOW1 (A)) ЗFIRST1 ( c ` b> FOLLOW1 (A )) пусто при всіх AО N b>. (Без ДКВ b>).
Теорему можна сформулювати так: по першому символу після нетермінала необхідно вибрати застосовне правило - отже ці символи різні і перетин порожньо. Ця теорема може застосовуватися до LL b> (k) - граматики, але не завжди виконуватися. Граматики для яких виконується теорема називаються сильними, таким чином всі LL b> (1) граматики - сильні. Необхідно також відмітити що кожна LL b> (k) - граматика однозначна, тому якщо є неоднозначна граматика - то вона не LL b> (k). Є нерозв'язна проблема розпізнавання, чи існує для даної КС-граматики G b>, що не є LL b> (k), еквівалентна їй LL b> (k) - граматика . Проте у ряді випадків таке перетворення можливо. Застосовується два способи:
Перший спосіб - усунення лівої рекурсії. ПЗМ: b> Хай G b> - граматика