Вам ніколи не потрібен CNF. У нього є недолік зміни граматичної структури. Але вам потрібно ввести проміжні нетермінали, щоб жодна права частина не була довшою 2 (2-форми), оскільки довжина RHS визначає складність. Найкраща спроба пояснити, що інтуїтивно - якщо пам'ять слугує, - це документ Боу Шіела, «Спостереження за контекстом, вільним розбором», опублікований у 1976 році на конференції з комп'ютерної лінгвістики. Алгоритм Ерлі неявно використовує 2-форму. Це просто приховано в алгоритмі. Що стосується відновлення та обробки лісу розбору, вам слід подивитися в Інтернеті "розбір лісу перехрестя". Це насправді дуже прямо. Багато паперів є в Інтернеті, якщо ви отримуєте (із цитат або змістовних таблиць) заголовки або авторів, щоб безпосередньо шукати їх.
Насправді, ти можеш зробити набагато більше, ніж CF, і все-таки отримати розбір лісів за багаточлен. Іноді виникає питання: що ти можеш зробити з цим, як тільки маєш?
Однією метою останньої статті, яку ви згадуєте, є показати, що складні алгоритми (наприклад, GLR) не обов'язково купують щось у часі чи в просторі, і можуть змінити ваш ліс розбору.
Одне зауваження щодо викладання. Я вважаю, що Ерлі, як і раніше, був надто складним для викладання, і його можна було б замінити більш простими алгоритмами з по суті однаковим навчальним змістом. Навчання - це поняття чи технології. В алгоритмі Ерлі істотні поняття приховані в складності деталей, а з технологічної точки зору вона застаріла. Це був чудовий документ, але це не означає, що це найкращий педагогічний підхід.
У літературі з обчислювальної лінгвістики може бути більше інформації, ніж у звичайних каналах інформатики. У мене немає книги Ceriel-Grune-Jacobs, але я був би здивований, якби у них не було всіх належних посилань (хоча я не впевнений у їхніх критеріях відбору).
Доповнення після запиту в коментарі (7 липня 2013 р.)
Це доповнення зміцнює існування більш простих алгоритмів, ніж Ерлі.
Як я вже говорив, пошук в Інтернеті за «лісом розбиття перехрестя» повинен швидко дати вам посилання, з яких ви зможете викопати далі.
Основна ідея полягає в тому, що всі шляхи, що розбиваються на будівництво спільного лісу, є не що інше, як стара конструкція перехрестя Бар Гіллеля, Перлеса і Шаміра для звичайної мови та без контекстної мови, використовуючи кінцевий автомат і без граматики, що не стосується контексту. Враховуючи граматику CF, ви застосовуєте конструкцію до тривіального автомата, який розпізнає лише ваш вхідний рядок. Це все. Спільний ліс - лише граматика для перехрестя. Він пов'язаний з початковою граматикою через гомоморфізм, розпізнає лише заданий рядок, але з усіма деревами розбору оригінальної граматики аж до цього гомоморфізму (тобто простого перейменування нетерміналів).
Отримана граматика містить безліч непотрібних речей, нетерміналів і правил, які є недосяжними від аксіоми (їх не можна знайти в рядку, похідних від початкового символу), або непродуктивними (не можуть бути виведені в термінал рядок).
Тоді або вам доведеться чистити її гарною щіткою в кінці (можливо, довгою, але алгоритмічно простою), або ви можете спробувати вдосконалити конструкцію, щоб в кінцевому підсумку було менше корисного пуху.
Наприклад, конструкція CYK саме така, але організована так, що всі створені правила та нетермінали є продуктивними, хоча багато хто може бути недосяжним. Цього можна очікувати від техніки знизу вгору.
Методики зверху вниз (такі як LR (k)) дозволять уникнути недосяжних правил та нетерміналів, але створять непродуктивні.
Дуже багато чищення зусиль можна досягти за рахунок адекватного використання покажчиків, я думаю, але на це я довго не дивився.
Усі існуючі алгоритми фактично дотримуються цієї моделі. Отже, це справді суть справи, і це дуже просто. Тоді навіщо закопувати його в складності?
У літературі пропонується багато "оптимізацій", які часто базуються на сімействі парсерних конструкцій LR (k), LL (k), можливо, з деяким статичним фактором цих конструкцій (Ерлі не має статичного факторингу). Він фактично може бути застосований до всіх відомих методик, включаючи старі аналізатори пріоритету. Я ставлю "оптимізацію" між цитатами, тому що зазвичай не зрозуміло, що ви оптимізуєте, або навіть, чи оптимізуєте ви насправді, чи вигода від поліпшення варте додаткової складності вашого аналізатора. Ви знайдете мало об’єктивних даних, формальних або експериментальних, щодо цього (є деякі), але багато інших претензій. Я не кажу, що нічого цікавого немає. Є кілька розумних ідей.
Тепер, коли ви знаєте основну ідею, "оптимізацію" або вдосконалення часто можна запровадити статично (можливо, поступово), побудувавши граматичний автомат із граматики, дотримуючись цікавого типу побудови парсера, а потім застосувати конструкція перехресного продукту для перетину до цього автомата (майже те саме, що робити з граматикою) або до граматики, отриманої з цього автомата.
Потім можна ввести дзвіночки, але це переважно технологічні деталі.
Як повідомляється, "Philosophiæ Naturalis Principia Mathematica" Ісаака Ньютона є чудовим предметом фізики та математики. Я не думаю, що це є у списку читання багатьох студентів. За інших рівних речей я не вважаю дуже корисним вчити алгоритм Ерлі, хоча це важливий історичний фрагмент. Студентам достатньо навчитися так, як це є. Загрожуючи збитими багатьма людьми, я думаю, що це так само і для паперу Knuth LR (k). Це чудовий фрагмент теоретичного аналізу і, мабуть, важливе читання для теоретика. Я сильно сумніваюся, що це так важливо для побудови аналізаторів, враховуючи сучасний стан технології, як апаратного, так і програмного забезпечення. Минули часи, коли синтаксичний аналіз був важливою частиною часу складання, або коли швидкість компіляторів була критичною проблемою (я знав одну корпорацію, яка померла від складання витрат приблизно 30 років тому). Фахівець з розбору може захотіти дізнатися, що спеціалізовані знання в якийсь момент, але пересічному студенту з інформатики, програмування чи інженерії цього не потрібно.
Якщо учням потрібно витратити більше часу на розбір, є інші розширення, які можуть бути кориснішими та більш формувальними, наприклад, такі, які використовуються в обчислювальній лінгвістиці. Перша роль викладання - це витягнути прості ідеї, що структурують наукові знання, а не змушувати студентів страждати від того, що мусили зазнати науковці (докторанти виняткували: це обряд проходження :-).
Ліцензія CC BY-SA 3.0 від автора