Перестановчі фрази з LR-розбором


16

Перестановочна фраза - це розширення до стандартних граматичних визначень BNF-контексту: перестановочна фраза містить виробництв (або, що еквівалентно, нетерміналів) від до . На позиції фрази перестановки ми хотіли б побачити кожну з цих постановок рівно один раз, але нас не цікавить впорядкування цих нетерміналів.{A1,,Ан}нА1Ан

Наприклад:

S <- X { A, B, C } Y

еквівалентно:

S <- X  A B C  Y
S <- X  A C B  Y
S <- X  B A C  Y
S <- X  B C A  Y
S <- X  C A B  Y
S <- X  C B A  Y

Ця концепція, як видається, введена у "Розширенні без контексту граматики з перестановковими фразами" . Тут також описано, як розбирати ці фрази в лінійний час за допомогою парселера LL (1).

У статті "Розбір фразування перестановок" описаний метод для розбору фразування перестановок за допомогою комбінаторів парсера. Це єдині два статті, які я знайшов, які розповідають про фразування фраз та про їх розбір.

Бачачи, що ми можемо легко розбирати такі фрази перестановки за допомогою парсерів на основі LL (1), я гадаю, що ми можемо зробити те ж саме з парсерами стилю LR (1). Моє питання, таким чином:

Чи можна граматику, що містить перестановочні фрази, проаналізовано лінійно за часом у розмірі вхідного рядка, використовуючи механізм LR (1), зберігаючи таблицю розумного розміру?

Перестановчі фрази не розширюють силу без контекстних мов: як у моєму прикладі вище, можна просто перерахувати всі можливі перестановки. Однак граматика потім вибухає, оскільки отримана граматика може мати розмір . Це дозволяє лінійний розбір часу, але розмір граматики стає занадто великим.О(|Г|!)

Вищенаведений підхід працює для будь-якого алгоритму розбору (хоча він і не корисний), тому, можливо, ми можемо зробити краще для конкретних алгоритмів. Ми можемо зменшити вибух до «просто» експоненціальної ( ), кодуючи фрази в таблицю LR: ми можемо мати елементи LR, кодування яких виробництв ще не було видно, а тому зменшити обрив для всіх підмножин пермутаційних фраз.О(2|Г|)

Хоча це і краще, але це, звичайно, недостатньо добре - наявність перестановочної фрази з 30 предметів зробить граматику непридатною. Є ще одна частина LR розбору, яку ми ще не торкалися, і це фактична процедура на основі стека, що використовується для розбору. Я думаю, що зберігання лічильників на стеці може вирішити проблему, але я не знаю, як це зробити.

Зараз я впроваджую генератор парсеру, і в проблемній області перестановка фраз буде подарунком з неба. Оскільки я використовую техніку LR (1), наступне вище питання.


Складність розбору LR (1) вже є експоненціальною в розмірі граматики без перестановочних фраз --- за винятком випадків, якщо ви здійснюєте обчислення парсера «на льоту», але тоді він відчуває себе більше як парсер Ерлі, ніж як справжній LR (1).
Сільвейн

2
Щодо решти Вашого запитання: cstheory.stackexchange.com/questions/4962/… показує нижню межу експоненції на розмір CFG для перестановок, а звичайна поліноміальна побудова CFG з PDA, це тягне за собою нижню межу експоненції на розмір КПК також.
Сільвейн

1
Я не дивився на статтю про LL (1). Дійсно, реалізований аналізатор вже не є КПК. Я все ще не вірю в існування "таблиці з розумним розміром", оскільки членство в комутативних графіках без контексту є повним NP (див., Наприклад, dx.doi.org/10.3233/FI-1997-3112 ), але це правда що важкі екземпляри можуть бути не LR (1).
Сільвейн

2
@Sylvain: Чи можете ви детальніше роз’яснити, як питання 4962 стосується цього? У питанні 4962 перестановка фіксується для кожної вхідної довжини, а рядки, що підлягають перестановці, змінюються. У поточному питанні перестановку ми не фіксуємо. Тому я не бачу реального зв'язку між ними.
Цуйоші Іто

2
@Tsuyoshito Ito: У LR (1) розбір DPDA, еквівалентного вхідній граматиці, спочатку будується, а потім запускається проти рядка для розпізнавання. Оскільки існує CFG лінійного розміру з перестановковими фразами для кожної мови перестановки, документ Ювала Філіуса (який є більш вичерпним, ніж його відповідь на cstheory: див. Cs.toronto.edu/~yuvalf/CFG-LB.pdf ) свідчить, що ні така DPDA може мати поліноміальний розмір в розмірі вхідної граматики.
Сільвейн

Відповіді:


1

Чи обдумали ви перетворити це на семантичну задачу? Замість граматичних правил для всіх перестановок нетерміналів {A, B, C} просто є одне правило для розпізнавання (A | B | C) ^ 3 разом із спеціальним внутрішнім кодом, який гарантує розпізнавання лише одного з кожного, інакше він оголошує помилка. Я б вставив порожнє виробництво перед вищевказаним пунктом, зменшення якого ініціює ініціалізацію всього, що ви використовуєте для підрахунку A, B і C, і один після, зменшення якого запускає перевірку лічильника і (якщо необхідно) стверджує помилку. (звичайно, це може стати дещо складним, якщо граматика рекурсивна через A, B та / або C)


0

Я не думаю, що одному не потрібен лічильник. По суті ви просто перевіряєте всі перестановки, але ламаєте

псевдо-код:

perm-match(input, pattern)
     if pattern = nil return true

     foreach(rule in pattern)
         if (match(input, rule))
             perm-match(input - matchedpart, pattern - rule)
             break
         end
     end
     return false
end

Ось більш конкретний приклад

Припустимо, ми намагаємось відповідати будь-якій перестановці abcd, а наш рядок - bcda

  • Крок 1: Знайдіть перший відповідний символ. У цьому випадку це b
  • Крок 2: Видаліть цей символ із нашого шаблону та зменшіть рядок: наприклад, acd та cda залишилися
  • Крок 3: Повторіть крок 1 для нових рядків
    • c збігів у cda, що залишає нам рекламу та da
    • сірник у да, який залишає нас з d і d
    • d збігається в d, що залишає нас з нулем в обох рядках

Отже, ви бачите, що цей простий алгоритм може перевірити перестановку досить легко, просто порівнюючи "рядки" поза порядком. Зауважте, що складність функції - це O (n!) Гірший випадок, а O (1) кращий випадок. У певному сенсі ми ведемо підрахунок, зберігаючи символи для відповідності в масиві. Я думаю, що це взагалі буде "швидким", оскільки в більшості випадків не можна мати справу з дуже великими росіянами.


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