Что такое двусмысленная контекстная свободная грамматика?
На самом деле я не совсем понимаю концепцию двусмысленности в контексте свободных грамматик. Если бы кто-нибудь мог помочь мне и объяснить концепцию или предоставить хороший ресурс, я бы очень признателен.
Ответы
Ответ 1
T * U;
Является ли это объявлением указателя или умножением? Вы не можете сказать, пока не знаете, что на самом деле есть T
и U
.
Таким образом, синтаксис выражения зависит от семантики (значения) выражения. Это не контекстно-бесплатный - на языке, свободном от контекста, это может быть только одно, а не два. (Вот почему они не позволяли выражениям быть допустимыми утверждениями в D.)
Другой пример:
T<U> V;
Является ли это использование шаблона или это операция больше или меньше? (Вот почему они изменили синтаксис на T!(U) V
в D - в круглых скобках только одно использование, а у кассиров другое использование.)
Ответ 2
Как бы вы разобрали это:
if condition_1 then if condition_2 then action_1 else action_2
К какому "if" принадлежит "else"?
В Python это:
if condition_1:
if condition_2:
action_1
else:
action_2
и
if condition_1:
if condition_2:
action_1
else:
action_2
Ответ 3
Рассмотрим входную строку, распознанную без контекстной грамматики. Строка получается неоднозначно, если она имеет два или более разных левых деривации или дерево разбора. Грамматика неоднозначна, если она генерирует строки неоднозначно.
Например, грамматика S → E + E | E * E - неоднозначная грамматика, поскольку она выводит строку x + x * x неоднозначно, другими словами, для представления выражения существует более одного дерева синтаксического анализа (на самом деле есть два).
Грамматику можно сделать недвусмысленной, изменив грамматику на:
E → E + T | Т
T → T * F | F
F → (E) | x
Реорганизованная грамматика всегда выводит строку однозначно, т.е. вывод всегда будет производить одно и то же дерево синтаксического анализа.