Я не понимаю, как контекстная чувствительность и неоднозначность влияют друг на друга.
То, что я считаю правильным, это:
Неоднозначность:
Неоднозначная грамматика приводит к построению более одного дерева синтаксического анализа с использованием левого или правого вывода. Язык, где все возможные грамматики неоднозначны, является неоднозначным языком.
Например, C ++ является неоднозначным языком, потому что x * y всегда может означать две разные вещи, как обсуждено в: Почему C ++ не может быть проанализирован с анализатором LR (1)? .
Контекст чувствительности:
В контекстно-зависимой грамматике есть правила, в которых левая часть этих правил может содержать (не) терминальные символы в дополнение к одному нетерминальному, необходимому в пределах lhs всех правил различных видов грамматик. Это означает, что вы не можете просто заменить нетерминал при спуске. Вместо этого сначала нужно посмотреть на окружающие нетерминалы.
Теперь меня беспокоят утверждения, которые более или менее говорят о том, что контекстно-зависимые парсеры могут анализировать неоднозначности, такие как x * y. Например, в приведенном выше связанном вопросе утверждается, что «... синтаксический анализатор, который [украшает синтаксическое дерево при его создании], не является контекстно-свободным, а синтаксические анализаторы LR (чистые) - контекстно-свободными». По моему мнению, это подразумевает, что контекстно-зависимые парсеры (противоположность контекстно-свободным парсерам?) Могут это делать. Другим примером будет Является ли какая-либо часть синтаксиса C ++ чувствительной к контексту? , где на этот вопрос отвечает «Да ...». То же самое здесь: Что такое неоднозначная контекстно-свободная грамматика?
Я не вижу, как эта неоднозначность в C ++ связана с контекстно-зависимой. Я не думаю, что есть какая-либо контекстно-зависимая грамматика, которая может справиться с этой неоднозначностью. Например, если вы берете вымышленное правило вроде
Typedef, *, PointerDeclaration -> Ident "*" Ident
тогда вы все равно не сможете определить (с помощью чистого анализа), использовался ли конкретный первый Ident (например, «x») во время Typedef (например, typedef double x;).
Таким образом, возможно, что термин "чувствительность к контексту" используется в связанных вопросах, хотя он означает нечто простое, например, зависимость от контекста (например, требуется больше информации, чем предоставлено простым анализатором). Или есть какая-то связь между "реальной" чувствительностью к контексту "и неясностями.
Редактировать Более конкретный вопрос: есть ли какие-либо двусмысленности внутри контекстно-свободных грамматик, с которыми можно справиться, используя контекстно-зависимые грамматики. Этот вопрос возникает у меня, потому что в связанных вопросах это звучит так, как будто неоднозначность C ++ иногда упоминается как проблема, связанная с контекстом.
Edit2 Дополнительная информация: В книге Компьютерные системы на странице 346 говорится, что такие требования, как наличие одинакового количества фактических и формальных параметров, могут быть выражены контекстно-зависимыми грамматиками. Но это очень громоздко, потому что вам нужно много сложных правил. Но, возможно, это также может относиться к неоднозначности C ++, упомянутой ранее. Так что у нас есть правила вроде
"Typedef double x", *, PointerDeclaration -> "x" "*" Ident
Конечно, такие правила будут очень ограничены, и вам потребуется огромное количество, чтобы выразить каждую возможность. По крайней мере, это может быть подходом к ответу на вопрос, можно ли (теоретически) безконтекстные неопределенности, не зависящие от контекста, заменить контекстно-зависимыми правилами