Чи існує якийсь загальний алгоритм розбору CFG, який розпізнає EPAL?


23

EPAL, мова навіть паліндром, визначається як мова, породжена наступною однозначною без контексту граматикою:

S→aa

S→bb

S→aSa

S→bSb

EPAL - це «бана» багатьох алгоритмів розбору: мені ще не доводилося стикатися з будь-яким алгоритмом розбору однозначних CFG, який може розібрати будь-яку граматику, що описує мову. Його часто використовують, щоб показати, що є однозначні CFG, які неможливо проаналізувати певним аналізатором. Це надихнуло моє запитання:

Чи існує якийсь алгоритм розбору, який приймає лише однозначні CFG, які працюють на EPAL?

Звичайно, можна створити спеціальний аналізатор з двома проходами для граматики, яка розбирає мову за лінійним часом. Мене цікавлять методи розбору, які не були розроблені спеціально з урахуванням EPAL.


1
Я майже боюся запитати: що не так з LL (1) шляхом рекурсивного походження?
— Рафаель

3
Рекурсивний спуск, що не відкликається, не може впоратися з EPAL, оскільки мова не є LL (k) для жодного k. Рекурсивний спуск із зворотним відстеженням може впоратися з граматикою за час, але це загальний алгоритм з експоненціальною поведінкою в гіршому випадку, що я не шукаю. O(n2)
— Олексій десять Бринк

O ( 2 N )O(N2) не є експоненціальним, а квадратичним. - експоненціальна. O(2N)
— Віктор Стафуса

1
@Victor: зворотний трек має експоненціальну поведінку в деяких граматиках, тільки не в цій граматиці. Але, оскільки алгоритм, який працює над неоднозначними граматиками, знижує його як відповідь на моє запитання.
— Олексій десять Бринк

1
@jmad: моя мета - не розбирати мову (це можна зробити тривіально в лінійний час), а скоріше задовольнити мою цікавість: я бачив, що вона використовується як приклад мови, яку неможливо розібрати методом розбору так багато разів, що мені цікаво, чи є якийсь метод розбору, який би його розпізнав.
— Олексій десять Бринк

Відповіді:


14

Розгляньте наступний ескіз стратегії розбору на власний ризик.

Замість того, щоб читати дані лише з одного кінця, ми читаємо з обох сторін і шукаємо відповідні правила. Ми можемо це зробити в стилі рекурсивного спуску; у виклику знайдіть префікс та суфікс на вхід, таким чином, що існує правило , до на решті слова. Якщо немає відповідного правила, відхиліть слово.w v A → w B v B ( )A()wvA→wBvB()

Цей алгоритм аналізує всі лінійні, однозначні граматики. лінійний час, якщо всі пари правил і мають або ¹. Сюди входить EPAL. В іншому випадку нам потрібно заглянути вперед, щоб ми могли зайняти час.A→wBvA→w′B′v′w≢pw′v≢sv′Θ(n2)

Ідея взагалі не працює для нелінійних граматик. Лінійні, але неоднозначні граматики взагалі не можна проаналізувати без зворотного відстеження (як мінімум, для негативних вводів).


  1. w≢pv означає, що і , тобто жодне слово не є префіксом іншого. подібний для суфіксів.w⋢vv⋢w≢s

1
Відмінно! Саме те, що я шукав. Чудово, що мова, яка не є NLR для будь-якого , розбирається таким простим алгоритмом. kNLR(k)k
— Олексій десять Бринк

1
Задумавшись над цим, я виявив незначну помилку у вашому описі: лінійна граматика однозначно, але немає такого унікального префікса, як ви його описуєте. Є ще унікальний префікс, але вам, можливо, доведеться зазирнути всередину нетерміналу, щоб отримати його, і ваш час роботи стає . Але ваш алгоритм працює на . O ( n 2 ) E P A LS→aAb|aBb,A→a,B→bO(n2)EPAL
— Олексій десять Бринк

@AlextenBrink Хороший улов. Я відредагував це для обліку.
— Рафаель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.