Компиляторы не используют «чистые» (что бы это ни значило) грамматики для анализа - это программы реального мира, которые делают то же, что и все программы реального мира, - применяют эвристику в определенных ситуациях. Вот почему компиляторы C ++ (и компиляторы для большинства других языков, кроме упражнений для старшекурсников) не создаются с использованием генераторов компиляторов.

утался в том, как контекстная чувствительность и неоднозначность влияют друг на друга.

То, что я считаю правильным:

Неоднозначность:

Неоднозначная грамматика приводит к построению более одного дерева синтаксического анализа с использованием левого или правого вывода. Язык, где все возможные грамматики неоднозначны, является неоднозначным языком.

Например, C ++ является неоднозначным языком, потому что x * y всегда может означать две разные вещи, как обсуждалось в:Почему C ++ не может быть проанализирован с помощью анализатора LR (1)?.

Контекст чувствительности:

У контекстно-зависимой грамматики есть правила, в которых левая часть этих правил может содержать (не) терминальные символы в дополнение к одному нетерминальному, необходимому в пределах lhs всех правил различных видов грамматик. Это означает, что вы не можете просто заменить нетерминал при спуске. Вместо этого вы должны смотреть на окружающие нетерминалы в первую очередь.

Теперь меня беспокоят утверждения, которые более или менее говорят о том, что контекстно-зависимые парсеры могут анализировать неоднозначности, такие как x * y. Например, в приведенном выше связанном вопросе говорится, что «... синтаксический анализатор, который [украшает синтаксическое дерево при его создании], не является контекстно-свободным, а синтаксические анализаторы LR (чистые) не контекстно-свободны». По моему мнению, это подразумевает, что контекстно-зависимые парсеры (противоположность контекстно-свободным парсерам?) Могут это делать. Другой пример будетЯвляется ли какая-либо часть синтаксиса C ++ контекстно-зависимой? где на этот вопрос отвечает «Да ...». Тоже самое:что такое неоднозначная контекстно-свободная грамматика?

Я не вижу, как эта неопределенность C ++ связана с контекстно-зависимой. Я не думаю, что есть какая-либо контекстно-зависимая грамматика, которая может справиться с этой неоднозначностью. Например, если вы берете вымышленное правило, такое как Typedef, <other> *, PointerDeclaration -> Ident "*" Ident

тогда вы все равно не сможете определить (с помощью чистого анализа), использовался ли конкретный первый Ident (например, «x») во время Typedef (например, typedef double x;).

Поэтому возможно, что термин «чувствительность к контексту» используется в связанных вопросах, хотя он означает нечто простое, например, зависимость от контекста (например, требуется больше информации, чем предоставлено простым анализатором). Или есть какая-то связь между «реальной» контекстной чувствительностью и неясностями.

редактировать Более конкретный вопрос: есть ли какие-либо двусмысленности в контекстно-свободных грамматиках, с которыми можно справиться, используя контекстно-зависимые грамматики. Этот вопрос возникает у меня, потому что в связанных вопросах это звучит так, как будто неоднозначность C ++ иногда упоминается как проблема, связанная с контекстом.

Edit2 Дополнительная информация: книгаКомпьютерные системы на странице 346 говорится, что такие требования, как наличие одинакового количества фактических и формальных параметров, могут быть выражены контекстно-зависимыми грамматиками. Но это очень громоздко, потому что вам нужно много сложных правил. Но, возможно, это также может относиться к неоднозначности C ++, упомянутой ранее. Так что у нас есть такие правила, как

"Typedef double x", <other> *, PointerDeclaration -> "x" "*" Идентификатор

Конечно, такие правила будут очень ограничены, и вам потребуется огромное количество, чтобы выразить каждую возможность. По крайней мере, это может быть подходом к ответу на вопрос, можно ли (теоретически) безконтекстные неопределенности, не зависящие от контекста, заменить контекстно-зависимыми правилами

Ответы на вопрос(3)

Ваш ответ на вопрос