Фраза перестановки является расширением стандартных (E) определений грамматики без контекста 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), возник следующий вопрос.