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