Дан контекст‑свободный грамматический пример: S -> S S | "a" | "b". Объясните, почему эта грамматика неоднозначна, предложите эквивалентную недвусмысленную грамматику или метод парсинга, который корректно разбирает строки и сохраняет структуру

14 Окт в 14:53
5 +5
0
Ответы
1

Почему неоднозначна:
Грамматика
[
S \to S\,S \;\mid\; "a" \;\mid\; "b"
]
порождает все непустые строки над алфавитом ({a,b}). Неоднозначность возникает потому, что операция конкатенации здесь реализована двоично и нефиксирована ассоциативность: одну и ту же строку можно получить разными способами группировки (разными деревьями вывода). Например строка ("aaa") имеет по крайней мере два разных синтаксических дерева (две разные группировки):
[
((a\,a)\,a)\quad\text{и}\quad(a\,(a\,a))
]
оба соответствуют выводам по правилам грамматики, значит грамматика неоднозначна. Более общо: строка длины (n) даёт число различных бинарных разбиений, равное каталановому числу (C_{n-1}), поэтому при (n\ge 3) неоднозначность проявляется обязательно.

Эквивалентная недвусмысленная грамматика:
Так как язык — просто непустые строки над ({a,b}) (регулярный язык), можно дать праворекурсивную (или леворекурсивную) однозначную грамматику, в которой порядок разбиений фиксируется (например, правый):
[
S \to T \;\mid\; S\,T,\qquad T \to "a" \;\mid\; "b".
]
Здесь каждое слово имеет единственную структуру (последовательность добавлений терминалов справа), поэтому грамматика недвусмысленна и порождает те же строки.

Альтернативы (парсинг/дисамбигуация):

Если нужно сохранить идею бинарной конкатенации, можно разобрать по исходной (амбигуральной) грамматике любым общим алгоритмом (GLR, Earley, CYK) и затем: из леса вывода выполнить «флаттенинг» — свести все смежные узлы (S) в n-арный список терминалов (то есть раскрыть ассоциативность), получив единственную каноническую структуру (список символов). Проще: распознавать язык как регулярный — автоматом или регулярным выражением ((a|b)+) — и строить однозначное представление строки как списка символов (то есть узел списка вместо произвольного бинарного дерева).

Краткое резюме:

Причина неоднозначности — разные группировки конкатенации. Решения: заменить правило (S\to S\,S) на правую или левую рекурсию, например (\;S\to T\mid S\,T,\;T\to "a"\mid "b"\;), или парсить любым полным парсером и затем канонизировать дерево, «сворачивая» ассоциативные S-вкладки в список.
14 Окт в 16:31
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир