Перестановочна фраза - це розширення до стандартних граматичних визначень BNF-контексту: перестановочна фраза містить виробництв (або, що еквівалентно, нетерміналів) від до . На позиції фрази перестановки ми хотіли б побачити кожну з цих постановок рівно один раз, але нас не цікавить впорядкування цих нетерміналів.
Наприклад:
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, кодування яких виробництв ще не було видно, а тому зменшити обрив для всіх підмножин пермутаційних фраз.
Хоча це і краще, але це, звичайно, недостатньо добре - наявність перестановочної фрази з 30 предметів зробить граматику непридатною. Є ще одна частина LR розбору, яку ми ще не торкалися, і це фактична процедура на основі стека, що використовується для розбору. Я думаю, що зберігання лічильників на стеці може вирішити проблему, але я не знаю, як це зробити.
Зараз я впроваджую генератор парсеру, і в проблемній області перестановка фраз буде подарунком з неба. Оскільки я використовую техніку LR (1), наступне вище питання.