Содержание
Формальная грамматика 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-символ
- любой символ исходного символьного набора, кроме новой-строки и
>
- новая-строка
- символ новой строки