preprocessing-file :=
[group]
group :=
group-part
group group-part
group-part :=
[pp-tokens] new-line
if-section
control-line
if-section :=
if-group [elif-groups] [else-group] endif-line
if-group :=
# if constant-expression new-line [group]
# ifdef identifier new-line [group]
# ifndef identifier new-line [group]
elif-groups :=
elif-group
elif-groups elif-group
elif-group :=
# elif constant-expression new-line [group]
else-group :=
# else new-line [group]
endif-group :=
# endif new-line
control-line :=
# include pp-tokens new-line
# define identifier replacement-list new-line
# define identifier([identifier-list] ) replacement-list newline
# undef identifier new-line
# line pp-tokens new-line
# error [pp-tokens] new-line
# pragma [pp-tokens] new-line
# new-line
replacement-list :=
[pp-tokens]
pp-tokens :=
preprocessing-token
pp-tokens preprocessing-token
new-line :=
the new-line character