Справочное руководство по 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 )
Список-типа:
имя-типа.
список-типа , имя-типа.
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.
- 96.
- 97.
- 98.
- 99.
- 100.
- 101.
- 102.
- 103.
- 104.
- 105.
- 106.
- 107.
- 108.
- 109.
- 110.
- 111.
- 112.
- 113.
- 114.
- 115.
- 116.
- 117.
- 118.
- 119.
- 120.
- 121.
- 122.
- 123.
- 124.
- 125.
- 126.
- 127.
- 128.
- 129.
- 130.
- 131.
- 132.
- 133.
- 134.
- 135.
- 136.
- 137.
- 138.
- 139.
- 140.
- 141.
- 142.
- 143.
- 144.
- 145.
- 146.
- 147.
- 148.
- 149.
- 150.
- 151.
- 152.
- 153.
- 154.
- 155.
- 156.
- 157.
- 158.
- 159.
- 160.
- 161.
- 162.
- 163.
- 164.
- 165.
- 166.
- 167.
- 168.
- 169.
- 170.
- 171.
- 172.
- 173.
- 174.
- 175.
- 176.
- 177.
- 178.
- 179.
- 180.
- 181.
- 182.
- 183.
- 184.
- 185.
- 186.
- 187.
- 188.
- 189.
- 190.
- 191.
- 192.
- 193.
- 194.
- 195.
- 196.
- 197.
- 198.
- 199.
- 200.
- 201.
- 202.
- 203.
- 204.
- 205.
- 206.
- 207.
- 208.
- 209.
- 210.
- 211.
- 212.
- 213.
- 214.
- 215.
- 216.
- 217.
- 218.
- 219.
- 220.
- 221.
- 222.
- 223.
- 224.
- 225.
- 226.
- 227.
- 228.
- 229.
- 230.
- 231.
- 232.
- 233.
- 234.
- 235.
- 236.
- 237.
- 238.
- 239.
- 240.
- 241.
- 242.
- 243.
- 244.