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