Дана контекстно‑свободная грамматика G: S -> SS | a | b. К какому классу по иерархии Хомского принадлежит порождаемый ею язык, является ли грамматика неоднозначной, и как преобразовать эту грамматику в эквивалентное формальное описание (регулярное выражение или детерминированный автомат), если это возможно; обсудите методы устранения неоднозначности и условия применимости
- Язык: порождаемый грамматикой G: S→SS∣a∣bG:\; S \to SS \mid a \mid bG:S→SS∣a∣b — все непустые строки над {a,b}\{a,b\}{a,b}: L(G)={a,b}+\;L(G)=\{a,b\}^+L(G)={a,b}+. - Класс по иерархии Хомского: язык регулярный (Type-3). Грамматика как запись — контекстно‑свободная (Type-2) и не является праволинейной, но порождаемый ею язык принадлежит классу Type‑3. - Неоднозначность: грамматика неоднозначна. Для любой строки длины n≥3n\ge 3n≥3 существует более одной разметки (разных бинарных деревьев разбиения); число различных деревьев для строки длины nnn равно каталанову числу Catn−1=1n(2n−2 n−1 ),
\mathrm{Cat}_{n-1}=\frac{1}{n}\binom{2n-2}{\,n-1\,}, Catn−1=n1(n−12n−2),
напр., для w=aaaw=aaaw=aaa есть две разные левые/правые ассоциации: S⇒SS⇒SSS⇒aSS⇒aaS⇒aaa
S\Rightarrow SS\Rightarrow SS S\Rightarrow a S S\Rightarrow a a S\Rightarrow a a a S⇒SS⇒SSS⇒aSS⇒aaS⇒aaa
и S⇒SS⇒SSS⇒SaS⇒aaS⇒aaa.
S\Rightarrow SS\Rightarrow S SS\Rightarrow S a S\Rightarrow a a S\Rightarrow a a a. S⇒SS⇒SSS⇒SaS⇒aaS⇒aaa. - Преобразование в эквивалентное регулярное описание: регулярное выражение (a∣b)+
(a\mid b)^+ (a∣b)+
Можно дать детерминированный автомат: Q={q0,q1}Q=\{q_0,q_1\}Q={q0,q1}, начальное q0q_0q0, принимающее F={q1}F=\{q_1\}F={q1}, переходы δ(q0,a)=δ(q0,b)=q1,δ(q1,a)=δ(q1,b)=q1.
\delta(q_0,a)=\delta(q_0,b)=q_1,\qquad \delta(q_1,a)=\delta(q_1,b)=q_1. δ(q0,a)=δ(q0,b)=q1,δ(q1,a)=δ(q1,b)=q1. Эквивалентная (нераспространённая и однозначная) праволинейная грамматика: S→aS∣bS∣a∣b,
S\to aS\mid bS\mid a\mid b, S→aS∣bS∣a∣b,
которая генерирует (a∣b)+(a\mid b)^+(a∣b)+ и не даёт неоднозначности (парсинг однозначно соответствует последовательности символов). - Методы устранения неоднозначности и применимость: - Для данного языка достаточно заменить правило S→SSS\to SSS→SS на праволинейные правила (как выше) — стандартный способ для регулярных языков: построить NFA/DFA или праволинейную грамматику (конструкция гарантированно убирает неоднозначность для регулярных языков). - В общем для контекстно‑свободных языков неоднозначность не всегда устранима: существуют фундаментально (встроенно) неоднозначные CFL; для них невозможно получить эквивалентную однозначную CFG. Для пригодных случаев используются методы рефакторинга грамматики, введение приоритетов/ассоциативности, преобразования в нормальные формы и попытки получить детерминированные подклассы (LL(k), LR(k)) — но успех зависит от языка.
- Класс по иерархии Хомского: язык регулярный (Type-3). Грамматика как запись — контекстно‑свободная (Type-2) и не является праволинейной, но порождаемый ею язык принадлежит классу Type‑3.
- Неоднозначность: грамматика неоднозначна. Для любой строки длины n≥3n\ge 3n≥3 существует более одной разметки (разных бинарных деревьев разбиения); число различных деревьев для строки длины nnn равно каталанову числу
Catn−1=1n(2n−2 n−1 ), \mathrm{Cat}_{n-1}=\frac{1}{n}\binom{2n-2}{\,n-1\,},
Catn−1 =n1 (n−12n−2 ), напр., для w=aaaw=aaaw=aaa есть две разные левые/правые ассоциации:
S⇒SS⇒SSS⇒aSS⇒aaS⇒aaa S\Rightarrow SS\Rightarrow SS S\Rightarrow a S S\Rightarrow a a S\Rightarrow a a a
S⇒SS⇒SSS⇒aSS⇒aaS⇒aaa и
S⇒SS⇒SSS⇒SaS⇒aaS⇒aaa. S\Rightarrow SS\Rightarrow S SS\Rightarrow S a S\Rightarrow a a S\Rightarrow a a a.
S⇒SS⇒SSS⇒SaS⇒aaS⇒aaa.
- Преобразование в эквивалентное регулярное описание: регулярное выражение
(a∣b)+ (a\mid b)^+
(a∣b)+ Можно дать детерминированный автомат: Q={q0,q1}Q=\{q_0,q_1\}Q={q0 ,q1 }, начальное q0q_0q0 , принимающее F={q1}F=\{q_1\}F={q1 }, переходы
δ(q0,a)=δ(q0,b)=q1,δ(q1,a)=δ(q1,b)=q1. \delta(q_0,a)=\delta(q_0,b)=q_1,\qquad \delta(q_1,a)=\delta(q_1,b)=q_1.
δ(q0 ,a)=δ(q0 ,b)=q1 ,δ(q1 ,a)=δ(q1 ,b)=q1 .
Эквивалентная (нераспространённая и однозначная) праволинейная грамматика:
S→aS∣bS∣a∣b, S\to aS\mid bS\mid a\mid b,
S→aS∣bS∣a∣b, которая генерирует (a∣b)+(a\mid b)^+(a∣b)+ и не даёт неоднозначности (парсинг однозначно соответствует последовательности символов).
- Методы устранения неоднозначности и применимость:
- Для данного языка достаточно заменить правило S→SSS\to SSS→SS на праволинейные правила (как выше) — стандартный способ для регулярных языков: построить NFA/DFA или праволинейную грамматику (конструкция гарантированно убирает неоднозначность для регулярных языков).
- В общем для контекстно‑свободных языков неоднозначность не всегда устранима: существуют фундаментально (встроенно) неоднозначные CFL; для них невозможно получить эквивалентную однозначную CFG. Для пригодных случаев используются методы рефакторинга грамматики, введение приоритетов/ассоциативности, преобразования в нормальные формы и попытки получить детерминированные подклассы (LL(k), LR(k)) — но успех зависит от языка.