• R.17.1 Служебные слова
  • R.17.2 Выражения
  • R.17.3 Описания
  • R.17.4 Описатели
  • R.17.5 Описания класса
  • R.17.6 Операторы
  • R.17.7 Препроцессор
  • R.17.8 Шаблоны типа
  • R.17.9 Обработка особых ситуаций
  • 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 ]

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

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

     список-описаний-парам optopt

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

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

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

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

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

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

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

     спецификации-описания абстрактный-описатель 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 )

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

     имя-типа

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








    Главная | В избранное | Наш E-MAIL | Прислать материал | Нашёл ошибку | Наверх