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