C lexical grammar
Tokens
token
:
keyword
identifier
constant
string-literal
punctuator
preprocessing-token
:
header-name
identifier
pp-number
character-constant
string-literal
punctuator
each non-whitespace character that can't be one of the above
Keywords
keyword
: one of
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
For a list of additional Microsoft-specific keywords, see C keywords.
Identifiers
identifier
:
identifier-nondigit
identifier
identifier-nondigit
identifier
digit
identifier-nondigit
:
nondigit
universal-character-name
other implementation-defined characters
nondigit
: one of
_
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
: one of
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
Constants
constant
:
integer-constant
floating-constant
enumeration-constant
character-constant
integer-constant
:
decimal-constant
integer-suffix
opt
binary-constant
1 integer-suffix
opt
octal-constant
integer-suffix
opt
hexadecimal-constant
integer-suffix
opt
decimal-constant
:
nonzero-digit
decimal-constant
digit
binary-constant
:1
binary-prefix
binary-digit
binary-constant
binary-digit
binary-prefix
1: one of
0b
0B
binary-digit
1: one of
0
1
octal-constant
:
0
octal-constant
octal-digit
hexadecimal-constant
:
hexadecimal-prefix
hexadecimal-digit
hexadecimal-constant
hexadecimal-digit
hexadecimal-prefix
: one of
0x
0X
nonzero-digit
: one of
1
2
3
4
5
6
7
8
9
octal-digit
: one of
0
1
2
3
4
5
6
7
hexadecimal-digit
: one of
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
opt
unsigned-suffix
long-long-suffix
opt
long-suffix
unsigned-suffix
opt
long-long-suffix
unsigned-suffix
opt
unsigned-suffix
: one of
u
U
long-suffix
: one of
l
L
long-long-suffix
: one of
ll
LL
floating-constant
:
decimal-floating-constant
hexadecimal-floating-constant
decimal-floating-constant
:
fractional-constant
exponent-part
opt floating-suffix
opt
digit-sequence
exponent-part
floating-suffix
opt
hexadecimal-floating-constant
:
hexadecimal-prefix
hexadecimal-fractional-constant
binary-exponent-part
opt floating-suffix
opt
hexadecimal-prefix
hexadecimal-digit-sequence
binary-exponent-part
floating-suffix
opt
fractional-constant
:
digit-sequence
opt .
digit-sequence
digit-sequence
.
exponent-part
:
e
sign
opt digit-sequence
E
sign
opt digit-sequence
sign
: one of
+
-
digit-sequence
:
digit
digit-sequence
digit
hexadecimal-fractional-constant
:
hexadecimal-digit-sequence
opt .
hexadecimal-digit-sequence
hexadecimal-digit-sequence
.
binary-exponent-part
:
p
sign
opt digit-sequence
P
sign
opt digit-sequence
hexadecimal-digit-sequence
:
hexadecimal-digit
hexadecimal-digit-sequence
hexadecimal-digit
floating-suffix
: one of
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
:
Any member of the source character set except the single quotation mark ('
), backslash (\
), or new-line character
escape-sequence
escape-sequence
:
simple-escape-sequence
octal-escape-sequence
hexadecimal-escape-sequence
universal-character-name
simple-escape-sequence
: one of
\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 literals
string-literal
:
encoding-prefix
"
s-char-sequence
opt "
encoding-prefix
:
u8
u
U
L
s-char-sequence
:
s-char
s-char-sequence
s-char
s-char
:
any member of the source character set except the double-quotation mark ("
), backslash (\
), or new-line character
escape-sequence
Punctuators
punctuator
: one of
[
]
(
)
{
}
.
->
++
--
&
*
+
-
~
!
/
%
<<
>>
<
>
<=
>=
==
!=
^
|
&&
||
?
:
;
...
=
*=
/=
%=
+=
-=
<<=
>>=
&=
^=
|=
,
#
##
<:
:>
<%
%>
%:
%:%:
Header names
header-name
:
<
h-char-sequence
>
"
q-char-sequence
"
h-char-sequence
:
h-char
h-char-sequence
h-char
h-char
:
any member of the source character set except the new-line character and >
q-char-sequence
:
q-char
q-char-sequence
q-char
q-char
:
any member of the source character set except the new-line character and "
Preprocessing numbers
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
, and binary-digit
are Microsoft-specific extensions.