Содержание

Формальная грамматика C

В этом приложении представлена формальная грамматика языка программирования C. Используется следующая нотация:

{цифра}(0)
Допускается ноль или более цифр.
{цифра}(1)
Допускается одна или более цифр.
<суффикс-целого>
Суффикс-целого не обязателен, допускается только одно вхождение.
A | B | C
Одно из A, B или C.

Лексика

Обсуждаются следующие темы:

Определение лексемы

лексема
ключевое-слово
или идентификатор
или константа
или стринговый-литерал
или оператор
или разделитель

Определение ключевого слова

ключевое-слово
стандартное-ключевое-слово
или ключевое-слово-Watcom-C
или ключевое-слово-Watcom-C/32
стандартное-ключевое-слово
auto       double     int        struct
break      else       long       switch
case       enum       register   typedef
char       extern     return     union
const      float      short      unsigned
continue   for        signed     void
default    goto       sizeof     volatile
do         if         static     while
ключевое-слово-Watcom-C
__based    __fortran   __near     __segment
__cdecl    __huge      _Packed    __segname
__export   __interrupt            __pascal
__self
__far      __loadds    __saveregs __syscall
ключевое-слово-Watcom-C/32
__far16    _Seg16      __stdcall

Определение идентификатора

идентификатор
нецифра {нецифра | цифра}(0)
нецифра
a | b | ... | z | A | B | ... | Z | _
цифра
0 | 1 | ... | 9

Определение константы

константа
константа-с-плавающей-точкой
или целая-константа
или константа-перечисления
или символьная-константа
константа-с-плавающей-точкой
дробная-константа <экспонентная-часть> <суффикс-плавающего>
или последовательность-цифр экспонентная-часть <суффикс-плавающего>
экспонентная-часть
e|E <+|-> последовательность-цифр
суффикс-плавающего
f | F | l | L
дробная-константа
<последовательность-цифр> . последовательность-цифр
или последовательность-цифр .
последовательность-цифр
{цифра}(1)
целая-константа
десятичная-константа <суффикс-целого>
или восьмеричная-константа <суффикс-целого>
или шестнадцатеричная-константа <суффикс-целого>
суффикс-целого
u|U <l|L>
или l|L <u|U>
десятичная-константа
цифра-не-нуль{цифра}(0)
цифра-не-нуль
1 | 2 | ... | 9
восьмеричная-константа
0{восьмеричная-цифра}(0)
восьмеричная-цифра
0 | 1 | ... | 7
шестнадцатеричная-константа
0x|0X{шестнадцатеричная-цифра}(1)
шестнадцатеричная-цифра
0 | 1 | ... | 9 |
a | b | ... | f | A | B | ... | F
константа-перечисления
идентификатор
символьная-константа
'{c-символ}(1)'
или L'{c-символ}(1)'
c-символ
любой символ из исходного набора символов за исключением одиночной
кавычки ', обратной косой черты \ или символа новой строки
или эскейп-последовательность
эскейп-последовательность — одна из
\' \" \\
\o \oo \ooo
\x{шестнадцатеричная-цифра}(1)
\a \b \f \n \r \t \v

Определение стрингового литерала

стринговый-литерал
"{s-символ}(0)"
или L"{s-символ}(0)"
s-символ
любой символ из исходного набора символов за исключением двойной
кавычки ", обратной косой черты \ или символа новой строки
или эскейп-последовательность

Определение оператора

оператор — один из
[  ]  (  )  .  ->
++  --  &  *  +  -  ~  !  sizeof
/  %  <<  >>  <  >  <=  >=  ==  !=  ^  |  &&  ||
?  :
=  *=  /=  %=  +=  -=  <<=  >>=  &=  ^=  |=
,  #  ##
:>

Определение разделителя

разделитель
[  ]  (  )  {  }  *  ,  :  = ; ... #

Структура выражений

Обсуждаются следующие темы:

Определение выражений

константное-выражение
условное-выражение
выражение
выражение-присваивания{ , выражение-присваивания}(0)
выражение-присваивания
условное-выражение
или унарное-выражение оператор-присваивания выражение-присваивания
оператор-присваивания — один из
= *= /= %= += -= <<= >>= &= ^= |=
условное-выражение
выражение-логического-ИЛИ <? выражение : условное-выражение>
выражение-логического-ИЛИ
выражение-логического-И {|| выражение-логического-И}(0)
выражение-логического-И
выражение-ИЛИ {&& выражение-ИЛИ}(0)
выражение-ИЛИ
выражение-исключающего-ИЛИ {| выражение-исключающего-ИЛИ}(0)
выражение-исключающего-ИЛИ
выражение-И {^ выражение-И}(0)
выражение-И
выражение-равенства {& выражение-равенства}(0)
выражение-равенства
выражение-отношения {==|!= выражение-отношения}(0)
выражение-отношения
выражение-сдвига {<|>|<=|>= выражение-сдвига}(0)
выражение-сдвига
аддитивное-выражение {<<|>> аддитивное-выражение}(0)
аддитивное-выражение
мультипликативное-выражение {+|- мультипликативное-выражение}(0)
мультипликативное-выражение
выражение-приведённое-к-типу {*|/|% выражение-приведённое-к-типу}(0)
выражение-приведённое-к-типу
унарное-выражение
или ( имя-типа ) выражение-приведённое-к-типу
унарное-выражение
постфиксное-выражение
или ++ | -- | sizeof унарное-выражение
или sizeof( имя-типа )
или унарный-оператор выражение-приведённое-к-типу
унарный-оператор — один из
& * + - ~ !
постфиксное-выражение
первичное-выражение
или постфиксное-выражение [ выражение ]
или постфиксное-выражение ( <список-аргументов-выражений> )
или постфиксное-выражение . идентификатор
или постфиксное-выражение -> идентификатор
или постфиксное-выражение ++
или постфиксное-выражение --
список-аргументов-выражений
выражение-присваивания {, выражение-присваивания}(0)
первичное-выражение
идентификатор
или константа
или стринговый-литерал
или ( выражение )

Определение декларации

декларация
спецификаторы-декларации <список-иниц-деклараторов>;
спецификаторы-декларации
спецификатор-класса-памяти <спецификаторы-декларации>
или спецификатор-типа <спецификаторы-декларации>
список-иниц-деклараторов
иниц-декларатор {, иниц-декларатор}(0)
иниц-декларатор
декларатор <= инициализатор>
спецификатор-класса-памяти
typedef | extern | static | auto | register
спецификатор-типа
void | char | short | int | long | float |
double | signed | unsigned
или спецификатор-struct-или-union
или спецификатор-enum
или имя-typedef
или квалификатор-типа
квалификатор-типа
const | volatile
или квалификатор-типа-Watcom-C
или квалификатор-типа-Watcom-C/32
квалификатор-типа-Watcom-C
__based    __fortran   __near     __segment
__cdecl    __huge      _Packed    __segname
__export   __interrupt            __pascal
__self
__far      __loadds    __saveregs __syscall
квалификатор-типа-Watcom-C/32
__far16    _Seg16      __stdcall
спецификатор-struct-или-union
struct-или-union <идентификатор> { список-деклараций-структуры }
или struct-или-union идентификатор
struct-или-union
struct | union
список-деклараций-структуры
{декларация-структуры}(1)
декларация-структуры
список-спецификаторов-типа список-struct-деклараций
список-спецификаторов-типа
{спецификатор-типа}(1)
список-struct-деклараций
struct-декларатор {, struct-декларатор}(0)
struct-декларатор
декларатор
или <декларатор> : константное-выражение
спецификатор-enum
enum <идентификатор> { список-перечисления }
или enum идентификатор
список-перечисления
перечислитель {, перечислитель}(0)
перечислитель
константа-перечисления <= константное-выражение>
декларатор
<указатель> прямой-декларатор
прямой-декларатор
идентификатор
или ( декларатор )
или прямой-декларатор [ <константное-выражение> ]
или прямой-декларатор ( список-типов-параметров )
или прямой-декларатор ( <список-идентификаторов> )
указатель
{* <список-спцификаторов-типа>}(1)
список-типов-параметров
список-параметров <, ...>
список-параметров
декларация-параметра {, декларация-параметра}(0)
декларация-параметра
спецификаторы-декларации декларатор
или спецификаторы-декларации <абстрактный-декларатор>
список-идентификаторов
идентификатор {, идентификатор}(0)
имя-типа
список-спецификаторов-типа <абстрактный-декларатор>
абстрактный-декларатор
указатель
или <указатель> прямой-абстрактный-декларатор
прямой-абстрактный-декларатор
( абстрактный-декларатор )
или <прямой-абстрактный-декларатор> [ <константное-выражение> ]
или <прямой-абстрактный-декларатор> ( <список-типов-параметров> )
имя-typedef
идентификатор
инициализатор
выражение-присваивания
или {список-инициализаторов <,>}
список-инициализаторов
инициализатор {, инициализатор}(0)

Определение команды

команда
помеченная-команда
или составная-команда
или команда-выражение
или команда-выбора
или циклическая-команда
или команда-перехода
помеченная-команда
идентификатор : команда
или case константное-выражение : команда
или default : команда
составная-команда
{ <список-деклараций> <список-команд> }
список-деклараций
{декларация}(1)
список-команд
{команда}(1)
команда-выражение
<выражение>;
команда-выбора
if ( выражение ) команда
или if ( выражение ) команда else команда
или switch ( выражение ) команда
циклическая-команда
while ( выражение ) команда
или do команда while ( выражение );
или for ( <выражение>; <выражение>; <выражение> ) команда
команда-перехода
goto идентификатор;
или continue;
или break;
или return <выражение>;

Внешние определения

файл
{внешнее-определение}(1)
внешнее-определение
определение-функции
или декларация
определение-функции
<спецификаторы-декларации> декларатор <список-деклараций>
составная-команда

Директивы препроцессора

файл-препроцессора
группа
группа
{часть-группы}(1)
часть-группы
<лексема-пп> новая-строка
или раздел-if
или управляющая-строка
раздел-if
группа-if {группа-elif}(0) <группа-else> строка-endif
группа-if
# if константное-выражение новая-строка <группа>
# ifdef идентификатор новая-строка <группа>
# ifndef идентификатор новая-строка <группа>
группа-elif
# elif константное-выражение новая-строка <группа>
группа-else
# else новая-строка <группа>
строка-endif
# endif новая-строка
управляющая-строка
# include лексемы-пп новая-строка
# define идентификатор <лексемы-пп> новая-строка
# define идент-ор( <список-идент-ов> ) <лексемы-пп> новая-строка
# undef идентификатор новая-строка
# line лексемы-пп новая-строка
# error <лексемы-пп> новая-строка
# pragma <лексемы-пп> новая-строка
# новая-строка
лексемы-пп
{лексема-препроцессора}(1)
лексема-препроцессора
имя-заголовочного-файла (только внутри директивы #include)
или идентификатор (без различия ключевых слов)
или константа
или стринговый-литерал
или оператор
или разделитель
или любой непробельный символ, из неперечисленных выше
имя-заголовочного-файла
<{h-символ}(0)>
h-символ
любой символ исходного символьного набора, кроме новой-строки и >
новая-строка
символ новой строки