Відповідь - так. Однак я б не робив цього з аналізатором Ерлі, оскільки є більш прості з тими ж можливостями.
В основному парсер Earley належить до сімейства загальних безконтекстних аналізаторів, які виробляють усі можливі розбори для даного рядка, коли граматика неоднозначна.
Є два способи (принаймні) розуміння цих парсерів:
як інтерпретація динамічного програмування автоматичного віджимання, що відповідає граматиці вхідного рядка;
як побудова перетину граматики з автоматикою скінченного стану.
Під час розбору одного рядка розглянутий автомат з кінцевим станом є лінійним автоматом, який розпізнає лише рядок
що підлягає розбору, по одному символу за один раз (кількість стану дорівнює ). Якщо застосувати конструкцію крос-продукт FA і CF garmmar
(Bar Гилеля, Перлис, Шамір 1961), ви отримаєте нову граматику CF , яка є новою граматиці , який генерує . Цікавим моментом зазвичай є те, що зберігає дерева розбору, використовувані , аж до нетермінальних перейменувань (за рахунок перехресного продукту).w|w|+1AGFL(A)∩L(G)FG
Таким чином, якщо FA генерує лише вашу вхідну рядок, граматика
генерує лише цю рядок (якщо вона є в , інакше вона генерує порожню мову порожній ). Крім того, він генерує його з усіма деревами розбору, які може використовувати для його створення.AFL(G)∅G
Ця граматика - це те, що зазвичай називають лісом спільного розбору , а всі загальні алгоритми розбору CF - це більш-менш оптимізована версія конструкції перехресних продуктів, будь то CYK, Earley, узагальнений LR або LL або інші. Тому все, що я говорю, стосується і них.F
Але, як бачите, це узагальнює аналіз цілого регулярного набору, якщо хтось зацікавлений у цьому.
Це саме ваше питання. У вас є рядок . Ви хочете , щоб розібрати його до деяких варіацій , які визначаються кінцевим числом станів перетворювача, який у вашому випадку є перетворювач , який виробляє всі рядки в межах деякого заданого Левенштейн редагування відстані від (але походження датчика не має значення). Набір цих рядків - це звичайний набір, який можна визначити FA, із зваженим переходом, який може обчислити відстань редагування кожного рядка.ww
Якщо ви робите перехресний добуток зі своєю граматикою , ви отримаєте загальну лісову граматику розбору яка генерує всі рядки в перетині. Крім того, ви отримуєте ваги за деякими правилами, щоб ви могли обчислити відстань редагування кожної з прийнятих рядків.GF
Якщо бажано, це можна використовувати для утримання лише струн з мінімальною відстані.
Однак це можна трохи покращити, оскільки композиція з машинами з кінцевим станом є асоціативною.
Якщо ви завжди використовуєте той самий перетворювач кінцевого стану, як це відбувається у вашому питанні, правильний шлях - скласти Граматику
і перетворювач (тут автомат Левенштайна), незалежно від вхідного рядка. Це дає вам зважену граматику, яку можна використовувати для розбору вхідного рядка . Проблема полягає в тому, що розбір брутальної конструкції перехрестя дає рядки на будь-якій відстані Левенштейна, тобто .GwΣ∗
Було б легко підрізати цю конструкцію, щоб отримати той же результат, що і раніше, але найкращий спосіб - це більш керована конструкція перехрестя, наприклад, організація динамічного програмування, що використовується більшістю парсерів у літературі, включаючи Ерлі, і використовувати її, щоб уникнути генерації марне правило, обчислюючи відстані та припиняючи будь-який обчислювальний шлях, коли він перевищує бажаний поріг. Динамічне програмування також може використовуватися для обчислення прямо лісу розбору (або дерева розбору) для рядка, який має найкоротшу відстань до вводу.