Справочное руководство по C++

R.17 Приложение A: Сводка грамматики.

Это приложение не относится к справочному руководству языка и не является определением конструкций C++.

Оно только должно служить более полному пониманию С++. Нельзя рассматривать его как точное определение языка, так как описанная здесь грамматика допускает произвольное множество конструкций, каждая из которых законна для С++. Чтобы различать выражения и описания, следует применять правила разрешения неопределенности (§R.6.8, §R.7.1, §R.10.1.1). Далее, для отсеивания синтаксически правильных, но бессмысленных, конструкций следует применять правила контроля доступа, разрешения неопределенности и контроля типа.

R.17.1 Служебные слова.

В описаниях: typedef (§R.7.1.3), класса (§R.9), перечисления (§R.7.2), шаблона типа - (§R.14) введены новые, зависящие от контекста, служебные слова, а именно:

Имя-класса:

 идентификатор.

Имя-перечисления:

 идентификатор.

Имя-typedef:

 идентификатор.

Отметим, что имя-typedef, обозначающее класс, является в то же время конструкцией имя-класса (§R.9.1).

R.17.2 Выражения.

Выражение:

 выражение-присваивания.

 выражение , выражение-присваивания.

Выражение-присваивания:

 выражение-условия.

 унарное-выражение операция-присваивания выражение-присваивания.

Операция-присваивания: один из.

 = *= /= %= += -= ››= ‹‹= &= ^= |=

Выражение-условия:

 логическое-выражение-ИЛИ.

 логическое-выражение-ИЛИ ? выражение : выражение-условия.

Логическое-выражение-ИЛИ:

 логическое-выражение-И.

 логическое-выражение-ИЛИ || логическое-выражение-И.

Логическое-выражение-И:

 выражение-ИЛИ.

 логическое-выражение-И && выражение-ИЛИ.

Выражение-ИЛИ:

 выражение-исключающего-ИЛИ.

 выражение-ИЛИ | выражение-исключающего-ИЛИ.

Выражение-исключающего-ИЛИ:

 выражение-И.

 выражение-исключающего-ИЛИ ^ выражение-И.

Выражение-И:

 выражение-равенства.

 выражение-И & выражение-равенства.

Выражение-равенства:

 выражение-отношения.

 выражение-равенства == выражение-отношения.

 выражение-равенства != выражение-отношения.

Выражение-отношения:

 сдвиговое-выражение.

 выражение-отношения ‹ сдвиговое-выражение.

 выражение-отношения › сдвиговое-выражение.

 выражение-отношения ‹= сдвиговое-выражение.

 выражение-отношения ›= сдвиговое-выражение.

Сдвиговое-выражение:

 аддитивное-выражение.

 сдвиговое-выражение ‹‹ аддитивное выражение.

 сдвиговое-выражение ›› аддитивное выражение.

Аддитивное-выражение:

 мультипликативное-выражение.

 аддитивное выражение + мультипликативное-выражение.

 аддитивное-выражение - мультипликативное-выражение.

Мультипликативное-выражение:

 выражение-pm.

 мультипликативное-выражение * выражение-pm.

 мультипликативное-выражение / выражение-pm.

 мультипликативное-выражение % выражение-pm.

Выражение-pm:

 выражение-приведения.

 выражение-pm .* выражение-приведения.

 выражение-pm -›* выражение-приведения.

Выражение-приведения:

 унарное-выражение.

 ( имя-типа ) выражение-приведения.

Унарное-выражение:

 постфиксное-выражение.

 ++ унарное выражение.

 -- унарное выражение.

 унарная-операция выражение-приведения.

 sizeof унарная-операция.

 sizeof ( имя-типа ).

 выражение-размещения.

 выражение-освобождения.

Унарная-операция: один из.

 * & + - ! ~

 выражение-размещения:

 :: opt new параметры-new opt имя-типа-new инициализатор-new.

 :: opt new параметры-new opt ( имя-типа ) инициализатор-new.

Параметры-new:

 ( список-выражений ).

Имя-типа-new:

 список-спецификаций-типа описатель-new opt.

Описатель-new:

 * список-спецификаций-cv opt описатель-new opt.

 имя-класса :: список-спецификаций-cv opt описатель-new opt.

 описатель-new opt [ выражение ].

Инициализатор-new:

 ( список-инициализаторов opt )

Выражение-освобождения:

 :: opt delete выражение-приведения.

 :: opt delete [ ] выражение-приведения.

Постфиксное-выражение:

 первичное-выражение.

 постфиксное-выражение [ выражение ].

 постфиксное-выражение ( список-выражений opt )

 имя-простого-типа ( список-выражений opt )

 постфиксное-выражение . имя.

 постфиксное-выражение -› имя.

 постфиксное-выражение ++

 постфиксное-выражение --

Список-выражений:

 выражение-присваивания.

 список-выражений , выражение-присваивания.

Первичное-выражение:

 литерал.

 this.

 :: идентификатор.

 :: имя-функции-операции.

 :: уточненное-имя.

 ( выражение ).

 имя.

Имя:

 идентификатор.

 имя-функции-операции.

 имя-функции-преобразования.

 ~имя-класса.

 уточненное-имя.

Уточненное-имя:

 уточняющее-имя-класса :: имя.

Литерал:

 целая константа.

 символьная константа.

 константа с плавающей точкой.

 строка литералов.

R.17.3 Описания.

Описания:

 спецификации-описания opt список-описателей opt;

 описание-asm.

 определение-функции.

 спецификация-связи.

Спецификация-описания:

 спецификация-класса-памяти.

 спецификация-типа.

 спецификация-fct.

 спецификация-шаблона-типа.

 friend.

 typedef.

Спецификации-описания:

 спецификации-описания opt спецификация-описания.

Спецификация-класса-памяти:

 auto.

 register.

 static.

 extern.

Спецификация-fct:

 inline.

 virtual.

Спецификация-типа:

 имя-простого-типа.

 спецификация-класса.

 спецификация-перечисления.

 спецификация-сложного-типа.

 :: имя-класса.

 const.

 volatile.

Имя-простого-типа:

 полное-имя-класса.

 уточненное-имя-типа.

 char.

 short.

 int.

 long.

 signed.

 unsigned.

 float.

 double.

 void.

Спецификация-сложного-типа:

 служебное-слово-класса имя-класса.

 служебное-слово-класса идентификатор.

Служебное-слово-класса:

 class.

 struct.

 union.

Уточненное-имя-типа:

 имя-typedef.

 имя-класса :: уточненное-имя-типа.

Полное-имя-класса:

 уточненное-имя-класса.

 :: уточненное-имя-класса.

Уточненное-имя-класса:

 имя-класса.

 имя-класса :: уточненное-имя-класса.

Имя-перечисления:

 идентификатор.

Спецификация-перечисления:

 enum идентификатор opt { список-перечисления }.

Список-перечисления:

 элемент-перечисления.

 список-перечисления , элемент-перечисления.

Элемент-перечисления:

 идентификатор.

 идентификатор = выражение-константа.

Спецификация-связи:

 extern строка-литерал { список-описаний opt }

 extern строка-литерал описание.

Список-описаний:

 описание.

 список-описаний описание.

Описание-asm:

 asm ( строка-литерал ) ;

R.17.4 Описатели.

Список-описаний:

 описатель-с-инициализатором.

 список-описаний , описатель-с-инициализатором.

Описатель-с-инициализатором:

 описатель инициализатор opt.

Описатель:

 имя-в-описателе.

 операция-ptr описатель.

 описатель ( список-описаний-параметров ) список-спецификаций-cv opt.

 описатель [ выражение-константа opt ]

 ( описатель ).

Операция-ptr:

 * список-спецификаций-cv opt.

 & список-спецификаций-cv opt.

 полное-имя-класса :: * список-спецификаций-cv opt.

Список-спецификаций-cv:

 const.

 volatile.

Имя-в-описателе:

 имя.

 имя-класса.

 ~имя-класса.

 имя-typedef.

 уточненное-имя-типа.

Имя-типа:

 список-спецификаций-типа абстрактный-описатель opt.

Список-спецификаций-типа:

 спецификация-типа список-спецификаций-типа.

Абстрактный-описатель:

 операция-ptr абстрактный-описатель opt.

 абстрактный-описатель opt ( список-описаний-параметров ) список-спецификаций_cv opt.

 абстрактный-описатель opt [ выражение-константа opt ]

 ( абстрактный-описатель ).

Список-описаний-параметров:

 список-описаний-парам opt … opt.

 список-описаний-парам , …

Список-описаний-парам:

 описание-параметра.

 список-описаний-парам , описание-параметра.

Описание-параметра:

 спецификации-описания описатель.

 спецификации-описания описатель = выражение.

 спецификации-описания абстрактный-описатель opt.

 спецификации-описания абстрактный-описатель opt = выражение.

Определение-функции:

 спецификации-описания opt описатель инициализатор-ctor тело-функции.

Тело-функции:

 составной-оператор.

Инициализатор:

 = выражение-присваивания.

 = { список-инициализаторов , opt }

 ( список-выражений ).

Список-инициализаторов:

 выражение-присваивания.

 список-инициализаторов , выражение-присваивания.

 { список-инициализаторов , opt }

R.17.5 Описания класса.

Спецификация-класса:

 заголовок-класса { список-членов opt }

Заголовок-класса:

 служебное-слово-класса идентификатор opt спец-базовых opt.

 служебное-слово-класса имя-класса спец-базовых opt.

Служебное-слово-класса:

 class.

 struct.

 union.

Список-членов:

 описание-члена список-членов opt.

 спецификация-доступа : список-членов opt.

Описание-члена:

 спецификации-описания opt список-описателей-членов opt ;

 определение-функции ; opt.

 уточненное-имя ;

Список-описателей-членов:

 описатель-члена.

 список-описателей-членов , описатель-члена.

Описатель-члена:

 описатель спецификация-чистой opt.

 идентификатор opt : выражение-константа.

Спецификация-чистой:

 = 0.

Список-базовых:

 спецификация-базовых.

 список-базовых , спецификация-базовых.

Спецификация-базовых:

 полное-имя-класса.

 virtual спецификация-доступа opt полное-имя-класса.

 спецификация-доступа virtual opt полное-имя-класса.

Спецификация-доступа:

 private.

 protected.

 public.

Имя-функции-преобразования:

 operator имя-типа-преобразования.

Имя-типа-преобразования:

 список-спецификаций-типа операция-ptr opt.

Инициализатор-ctor:

 : список-инициализаторов-членов.

Список-инициализаторов-членов:

 инициализатор-члена.

 инициализатор-члена , список-инициализаторов-члена.

Инициализатор-члена:

 полное-имя-класса ( список-выражений opt )

 идентификатор.

Имя-функции-оператор:

 operator операция.

Операция : один из.

 new delete.

 + - * / % ^& | ~

 ! = ‹ › += -= *= /= %=

 ^= &= |= ‹‹ ›› ››= ‹‹= == !=

 ‹= ›= && || ++ -- , -›* -›

 () []

R.17.6 Операторы.

Оператор:

 помеченный-оператор.

 оператор-выражение.

 составной-оператор.

 выбирающий-оператор.

 оператор-цикла.

 оператор-перехода.

 оператор-описания.

Помеченный-оператор:

 идентификатор : оператор.

 case выражение-константа : оператор.

 default : оператор.

Оператор-выражение:

 выражение opt;

Составной-оператор:

 { список-операторов opt }

Список-операторов:

 оператор.

 список-операторов оператор.

Выбирающий-оператор:

 if ( выражение ) оператор.

 if ( выражение ) оператор else оператор.

 switch ( выражение ) оператор.

Оператор-цикла:

 while ( выражение ) оператор.

 do оператор while ( выражение ).

 for ( оператор-иниц выражение opt ; выражение opt ) оператор.

Оператор-иниц:

 оператор-выражение.

 оператор-описание.

Оператор-перехода:

 break ;

 continue ;

 return выражение opt ;

 goto идентификатор ;

Оператор-описания:

 описание.

R.17.7 Препроцессор.

#define идентификатор строка-лексем.

#define идентификатор ( идентификатор , … , идентификатор )  строка-лексем.

#include "имяфайла".

#include ‹имяфайла›

#line константа "имяфайла" opt.

#undef идентификатор.

Условное:

 часть-if части-elif opt часть-else opt строка-endif.

Часть-if:

 строка-if текст.

Строка-if:

 # if выражение-константа.

 # ifdef идентификатор.

 # ifndef идентификатор.

Части-elif:

 строка-elif текст.

 части-elif строка-elif текст.

Строка-elif:

 # elif выражение-константа.

Часть-else:

 строка-else текст.

Строка-else:

 # else.

Строка-endif:

 # endif.

R.17.8 Шаблоны типа.

Описание-шаблона-типа:

 template ‹ список-параметров-шаблона-типа › описание.

Список-параметров-шаблона-типа:

 параметр-шаблона-типа.

 список-параметров-шаблона-типа , параметр-шаблона-типа.

Параметр-шаблона-типа:

 параметр-типа.

 описание-параметра.

Параметр-типа:

 class идентификатор.

Имя-шаблонного-класса:

 имя-шаблона-типа ‹ список-парам-шаблона-типа ›

Список-парам-шаблона-типа:

 парам-шаблона-типа.

 список-парам-шаблона-типа , парам-шаблона-типа.

Парам-шаблона:

 выражение.

 имя-типа.

R.17.9 Обработка особых ситуаций.

Проверяемый-блок:

 try составной-оператор список-обработчиков.

Список-обработчиков:

 обработчик список-обработчиков opt.

Обработчик:

 catch ( описание-особой-ситуации ) составной-оператор.

Описание-особой-ситуации:

 список-спецификаций-типа описатель.

 список-спецификаций-типа абстрактный-описатель.

 список-спецификаций-типа.

 …

Выражение-запуска:

 throw выражение opt.

Спецификация-особой-ситуации:

 throw ( список-типа opt )

Список-типа:

 имя-типа.

 список-типа , имя-типа.