Есть ли какой-нибудь неинтеллектуальный алгоритм разбора CFG, который распознает EPAL?

23

EPAL, язык четных палиндромов, определяется как язык, генерируемый следующей однозначной контекстно-свободной грамматикой:

Saa

Sbb

SaSa

SbSb

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()wvAwBvB()

Этот алгоритм анализирует все линейные однозначные грамматики. Требуется линейное время, если все пары правил и имеют или ¹. Это включает в себя EPAL. В противном случае нам нужно смотреть в будущее, чтобы мы могли занять время.AwBvAwBv v s v Θ ( n 2 )wpwvsvΘ(n2)

Идея вообще не работает для нелинейных грамматик. Линейные, но неоднозначные грамматики, как правило, не могут быть проанализированы без возврата (по крайней мере, для отрицательных входных данных).


  1. w v v w swpv означает, что а , т.е. ни одно слово не является префиксом другого. похож на суффиксы.wvvws
Рафаэль
источник
1
Превосходно! Именно то, что я искал. Замечательно, что язык, который не является для любого , разбирается с помощью такого простого алгоритма. kNLR(k)k
Алекс тен Бринк
1
Поразмыслив над этим, я обнаружил небольшую ошибку в вашем описании: линейная грамматика однозначно, но нет такого уникального префикса, как вы его описали. Там все еще есть уникальный префикс, но вам, возможно, придется заглянуть в нетерминал, чтобы получить его, и ваше время выполнения станет . Ваш алгоритм работает на хотя. O ( n 2 ) E P A LSaAb|aBb,Aa,BbO(n2)EPAL
Алекс тен Бринк
@AlextenBrink Хороший улов. Я отредактировал, чтобы учесть это.
Рафаэль