Поделиться через


Лексическая грамматика C

Токены

token:
keyword
identifier
constant
string-literal
punctuator

preprocessing-token:
header-name
identifier
pp-number
character-constant
string-literal
punctuator
 любой символ, отличный от пробела, который не может быть одним и перечисленных выше элементов

Ключевые слова

keyword: один из
auto break case char const continue
default do double else enum extern
float for goto if inline int long
register restrict return short signed
sizeof static struct switch typedef union
unsigned void volatile while _Alignas
_Alignof _Atomic _Bool _Complex _Generic
_Imaginary _Noreturn _Static_assert
_Thread_local

Список дополнительных ключевых слов для систем Майкрософт см. в статье Ключевые слова в C.

Identifiers

identifier:
identifier-nondigit
identifier identifier-nondigit
identifier digit

identifier-nondigit:
nondigit
universal-character-name
 другие символы, определенные реализацией

nondigit: один из
_ a b c d e f g h i j k l m
n o p q r s t u v w x y z
A B C D E F G H I J K L M
N O P Q R S T U V W X Y Z

digit: один из
0 1 2 3 4 5 6 7 8 9

universal-character-name:
\u hex-quad
\U hex-quad hex-quad

hex-quad:
hexadecimal-digit hexadecimal-digit hexadecimal-digit hexadecimal-digit

Константы

constant:
integer-constant
floating-constant
enumeration-constant
character-constant

integer-constant:
decimal-constant integer-suffixнеоб.
binary-constant1 integer-suffixнеоб.
octal-constant integer-suffixнеоб.
hexadecimal-constant integer-suffixнеоб.

decimal-constant:
nonzero-digit
decimal-constant digit

binary-constant:1
binary-prefix binary-digit
binary-constant binary-digit

binary-prefix1: один из
0b 0B

binary-digit1: один из
0 1

octal-constant:
0
octal-constant octal-digit

hexadecimal-constant:
hexadecimal-prefix hexadecimal-digit
hexadecimal-constant hexadecimal-digit

hexadecimal-prefix: один из
0x 0X

nonzero-digit: один из
1 2 3 4 5 6 7 8 9

octal-digit: один из
0 1 2 3 4 5 6 7

hexadecimal-digit: один из
0 1 2 3 4 5 6 7 8 9
a b c d e f
A B C D E F

integer-suffix:
unsigned-suffix long-suffixнеоб.
unsigned-suffix long-long-suffixнеоб.
long-suffix unsigned-suffixнеоб.
long-long-suffix unsigned-suffixнеоб.

unsigned-suffix: один из
u U

long-suffix: один из
l L

long-long-suffix: один из
ll LL

floating-constant:
decimal-floating-constant
hexadecimal-floating-constant

decimal-floating-constant:
fractional-constant exponent-partopt floating-suffixopt
digit-sequence exponent-part floating-suffixнеоб.

hexadecimal-floating-constant:
hexadecimal-prefix hexadecimal-fractional-constant binary-exponent-partнеоб. floating-suffixнеоб.
hexadecimal-prefix hexadecimal-digit-sequence binary-exponent-part floating-suffixнеоб.

fractional-constant:
digit-sequenceнеоб. . digit-sequence
digit-sequence .

exponent-part:
eнеоб.sign digit-sequence
Eнеоб.sign digit-sequence

sign: один из
+ -

digit-sequence:
digit
digit-sequence digit

hexadecimal-fractional-constant:
hexadecimal-digit-sequenceнеоб. . hexadecimal-digit-sequence
hexadecimal-digit-sequence .

binary-exponent-part:
pнеоб.sign digit-sequence
Pнеоб.sign digit-sequence

hexadecimal-digit-sequence:
hexadecimal-digit
hexadecimal-digit-sequence hexadecimal-digit

floating-suffix: один из
f l F L

enumeration-constant:
identifier

character-constant:
' c-char-sequence '
L' c-char-sequence '

c-char-sequence:
c-char
c-char-sequence c-char

c-char:
 Любой элемент исходной кодировки, кроме одинарной кавычки ('), обратной косой черты (\) и символа новой строки
escape-sequence

escape-sequence:
simple-escape-sequence
octal-escape-sequence
hexadecimal-escape-sequence
universal-character-name

simple-escape-sequence: один из
\a \b \f \n \r \t \v
\' \" \\ \?

octal-escape-sequence:
\ octal-digit
\ octal-digit octal-digit
\ octal-digit octal-digit octal-digit

hexadecimal-escape-sequence:
\x hexadecimal-digit
hexadecimal-escape-sequence hexadecimal-digit

Строковые литералы

string-literal:
encoding-prefix " s-char-sequenceнеоб. "

encoding-prefix:
u8
u
U
L

s-char-sequence:
s-char
s-char-sequence s-char

s-char:
 Любой элемент исходной кодировки, кроме двойной кавычки ("), обратной косой черты (\) и символа новой строки
escape-sequence

Символы пунктуации

punctuator: один из
[ ] ( ) { } . ->
++ -- & * + - ~ !
/ % << >> < > <= >= ==
!= ^ | && || ? : ; ...
= *= /= %= += -= <<= >>=
&= ^= |= , # ##
<: :> <% %> %: %:%:

Имена заголовков

header-name:
< h-char-sequence >
" q-char-sequence "

h-char-sequence:
h-char
h-char-sequence h-char

h-char:
 любой член исходного набора символов, кроме символа новой строки и >

q-char-sequence:
q-char
q-char-sequence q-char

q-char:
 любой член исходного набора символов, кроме символа новой строки и "

Предварительная обработка чисел

pp-number:
digit
. digit
pp-number digit
pp-number identifier-nondigit
pp-number e sign
pp-number E sign
pp-number p sign
pp-number P sign
pp-number .

1 binary-constant, binary-prefix и binary-digit — расширения для систем Майкрософт.

См. также

Краткие сведения о синтаксисе языка C