EPAL, язык четных палиндромов, определяется как язык, генерируемый следующей однозначной контекстно-свободной грамматикой:
EPAL - это «проклятие» многих алгоритмов синтаксического анализа: мне еще не приходилось сталкиваться с каким-либо алгоритмом синтаксического анализа однозначных CFG, который может анализировать любую грамматику, описывающую язык. Он часто используется, чтобы показать, что существуют однозначные CFG, которые не могут быть проанализированы конкретным парсером. Это вдохновило мой вопрос:
Есть ли какой-нибудь алгоритм разбора, принимающий только однозначные CFG, которые работают на EPAL?
Конечно, можно разработать специальный двухпроходный синтаксический анализатор для грамматики, который анализирует язык за линейное время. Мне интересны методы синтаксического анализа, которые не были разработаны специально с учетом требований EPAL.
источник
Ответы:
Рассмотрим следующую схему стратегии разбора на свой страх и риск.
Вместо того, чтобы читать ввод только с одного конца, мы читаем с обеих сторон и ищем подходящие правила. Мы можем сделать это в стиле рекурсивного спуска; в вызове найдите префикс и суффикс к входу так, чтобы существовало правило от , до на оставшемся слове. Если нет соответствующего правила, отклоните слово.w v A → w B v B ( )A() w v A→wBv B()
Этот алгоритм анализирует все линейные однозначные грамматики. Требуется линейное время, если все пары правил и имеют или ¹. Это включает в себя EPAL. В противном случае нам нужно смотреть в будущее, чтобы мы могли занять время.A→wBv A→w′B′v′ v ≢ s v ′ Θ ( n 2 )w≢pw′ v≢sv′ Θ(n2)
Идея вообще не работает для нелинейных грамматик. Линейные, но неоднозначные грамматики, как правило, не могут быть проанализированы без возврата (по крайней мере, для отрицательных входных данных).
источник