Я часто слышу утверждения, что С++ - это контекстно-зависимый язык. Возьмем следующий пример:
a b(c);
Это определение переменной или объявление функции? Это зависит от значения символа c. Если c - переменная, то a b(c); определяет переменную с именем b типа a. Он инициализируется с помощью c. Но если c является типом, то a b(c); объявляет функцию с именем b, которая принимает c и возвращает a.
Если вы посмотрите определение контекстно-свободных языков, в основном вам будет сказано, что все правила грамматики должны иметь левые стороны, которые состоят всего из одного нетерминального символа. С другой стороны, контекстно-зависимые грамматики допускают произвольные строки терминальных и нетерминальных символов в левой части.
Просматривая приложение А "Язык программирования на C++", я не мог найти ни одного правила грамматики, в котором было бы что-то еще, кроме одного нетерминального символа с левой стороны. Это означало бы, что С++ не имеет контекста. (Конечно, любой контекстно-свободный язык также контекстно-зависим в том смысле, что контекстно-свободные языки образуют подмножество контекстно-зависимых языков, но это не так.)
Итак, С++ контекстно-зависимый или контекстно-зависимый?
