C++. Бархатный путь. Часть 1 - Объявление переменных
ОГЛАВЛЕНИЕ
Объявление переменных
Мы приступаем к изучению синтаксиса операторов C++. В языке различают несколько типов операторов. Каждый из них выполняет в программе строго определённые функции.
Так, операторы объявления служат для ввода имён в программу. Процедура ввода имени переменной предполагает не только создание отличного от любого ключевого слова идентификатора, но и кодирование дополнительной информации о характеристиках объекта, с которым будет связано объявляемое имя.
К характеристикам объекта относятся тип объекта, класс памяти, время жизни объекта, множество других свойств, представляемых различными модификаторами.
Прежде чем приступить к описанию грамматики объявления переменных, введём для употребления в БНФ пару новых символов: [ и ]. Эти символы мы будем называть синтаксическими скобками. Заключение какого либо символа БНФ в синтаксические скобки означает, что этот символ в данной БНФ, а значит и в описываемом выражении является необязательным элементом. Он может входить в выражение, а может и не появляться вовсе.
Договоримся также об использовании в БНФ ещё одного символа. Этот символ будет иметь вид последовательности из пяти звёздочек, стоящих непосредственно за символом ::= в левой части формулы. Таким образом, содержащая этот символ БНФ будет выглядеть так:
Описатель ::= *****
или даже так:
::= *****
Этот символ мы будем называть прерывателем БНФ. Он будет означать, что определение нетерминального символа прерывается и будет продолжено позже.
Оператор ::= ОператорОбъявления
::= *****
ОператорОбъявления ::= Объявление
Объявление ::= ОбъявлениеПеременной
::= *****
ОбъявлениеПеременной ::= ОбъявлениеПеременнойОсновногоТипа
::= *****
ОбъявлениеПеременнойОсновногоТипа ::=
[СписокСпецификаторовОбъявления] [СписокОписателей];
СписокСпецификаторовОбъявления ::=
[СписокСпецификаторовОбъявления] СпецификаторОбъявления
СпецификаторОбъявления ::= СпецификаторКлассаПамяти
::= СпецификаторТипа
::= cvСпецификатор
::= fctСпецификатор
::= *****
СпецификаторКлассаПамяти ::= auto
::= register
::= static
::= extern
СпецификаторТипа ::= ИмяПростогоТипа
::= СпецификаторПеречисления
::= СпецификаторКласса
::= УточнённыйСпецификаторТипа
УточнённыйСпецификаторТипа ::= КлючевоеСловоКласса Идентификатор
::= КлючевоеСловоКласса ИмяКласса
::= enum ИмяПеречисления
ИмяПростогоТипа ::= char
::= short
::= int
::= long
::= signed
::= unsigned
::= float
::= double
::= void
::= ******
cvСпецификатор ::= const
::= volatile
СписокОписателей ::= ОписательИнициализатор
::= СписокОписателей , ОписательИнициализатор
ОписательИнициализатор ::= Описатель [Инициализатор]
Описатель ::= dИмя
::= (Описатель)
::= *****
Инициализатор ::= = Выражение
::= (СписокВыражений)
::= *****
Выражение ::= Литерал
::= Имя
::= *****
СписокВыражений ::= ВыражениеПрисваивания
::= СписокВыражений , ВыражениеПрисваивания
dИмя ::= Имя
::= ИмяКласса
::= ~ ИмяКласса
::= ОписанноеИмяТипа
::= КвалифицированноеИмяТипа
ВыражениеПрисваивания - этот нетерминальный символ используется в Справочном руководстве по C++ для обозначения элементов списка выражений. Не следует особо смущаться по поводу этого нового обозначения. Это всего лишь частный случай выражения.
dИмя - это имя того, что описывается описателем в данном объявлении. В "Справочном руководстве по языку программирования C++" английский эквивалент понятия описатель - declarator. Обилие нетерминальных символов, производных от символа Имя не должно вызывать никаких затруднений. В конечном счёте, нетерминальные символы ИмяКласса , ОписанноеИмяТипа , ИмяПеречисления (об этом позже) - являются обыкновенными идентификаторами. Всё зависит от контекста объявления. Что объявляется, так и называется. Именующее класс ОписанноеИмяТипа одновременно является и ИменемКласса .
ИмяКласса ::= Идентификатор
ОписанноеИмяТипа ::= Идентификатор
ИмяПеречисления::= Идентификатор
Мы располагаем достаточно большим (хотя пока и неполным) множеством БНФ, которые задают правила построения синтаксически безупречных операторов объявления переменных в C++.
Согласно приведённым правилам, оператором объявления переменных будет считаться пустой оператор
;
он состоит из точки с запятой. Между прочим, точкой с запятой заканчиваются все операторы C++. Оператором объявления будет также считаться и такая последовательность спецификаторов объявления:
auto register static extern char short int const;
и здесь также важно не забыть поставить точку с запятой. С точки зрения синтаксиса это правильное предложение.
Язык программировани C++ позволяет описывать данные и алгоритмы их обработки. Вместе с тем, правильно построенная цепочка слов языка может быть абсолютно бессмысленной, то есть не нести никакой информации ни о данных, ни о шагах конкретного алгоритма. Большая часть порождаемых с помощью грамматических правил предложений оказывается семантически некорректными и лишёнными всякого смысла.
Грамматика не отвечает за семантику и тем более за смысл предложений. Она всего лишь описывает правила построения операторов. Тем не менее, транслятор обеспечивает частичный семантический контроль предложений. Поэтому ранее рассмотренные объявления и воспринимаются как ошибочные. Также ошибочным оказывается объявление, состоящее из одного спецификатора объявления:
int ;
Можно было бы усовершенствовать систему обозначений, которая применяется в БНФ, а заодно и сделать более строгими правила синтаксиса. Например, можно было бы добиться того, чтобы пустые операторы воспринимались как синтаксически некорректные предложения. Однако это не может привести к кардинальному решению проблемы семантического контроля.