A Language Syntax Summary

This section summarizes the syntax of the C language, using the syntax of the ANSI C Standard. Syntactic categories are indicated with bold type, and literal words or characters are indicated with monospaced, nonitalicized type. A colon following a syntactic category introduces its definition. Alternative definitions are listed on separate lines, or are prefaced by the words "one of." An optional element is indicated by the subscript (opt). For example, the following line indicates an optional expression enclosed in braces:

{ expression(opt) }

The section numbers shown in parentheses refer to the section of the American National Standard for Information Systems-Programming Language C (document number: X3.159-1989) that discusses that part of the language.

A.1.1 Lexical Grammar

A.1.1.1 Tokens

token: (§3.1)

   keyword
   identifier
   constant
   string-literal
   operator
   punctuator

preprocessing-token: (§3.1)

   header-name
   identifier
   pp-number
   character-constant
   string-literal
   operator
   punctuator
   each nonwhite-space character that cannot be one of the above

A.1.1.2 Keywords

keyword: (§3.1.1) one of


    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

A.1.1.3 Identifiers

identifier: (§3.1.2)

   nondigit
   identifier nondigit
   identifier digit

nondigit: §3.1.2 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: (§3.1.2) one of


    0  1  2  3  4  5  6  7  8  9

A.1.1.4 Constants

constant: (§3.1.3)

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

floating-constant: (§3.1.3.1)

   fractional-constant exponent-part(opt) floating-
   suffix(opt)
   digit-sequence exponent-part floating-suffix(opt)

fractional-constant: (§3.1.3.1)

   digit-sequence(opt) . digit-sequence
   digit-sequence .

exponent-part: (§3.1.3.1)

   e  sign(opt)  digit-sequence
   E  sign(opt)  digit-sequence

sign: (§3.1.3.1) one of

   + -

digit-sequence: (§3.1.3.1)

   digit
   digit-sequence digit

floating-suffix: (§3.1.3.1) one of



f l F L

integer-constant: (§3.1.3.2)

   decimal-constant integer-suffix(opt)
   octal-constant integer-suffix(opt)
   hexadecimal-constant integer-suffix(opt)

decimal-constant: (§3.1.3.2)

   nonzero-digit
   decimal-constant digit

octal-constant: (§3.1.3.2)

   0
   octal-constant octal-digit

hexadecimal-constant: (§3.1.3.2)

   0x hexadecimal-digit
   0X hexadecimal-digit
   hexadecimal-constant hexadecimal-digit

nonzero-digit: (§3.1.3.2) one of


    1  2  3  4  5  6  7  8  9

octal-digit: (§3.1.3.2) one of


    0  1  2  3  4  5  6  7

hexadecimal-digit: (§3.1.3.2) 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: (§3.1.3.2)

   unsigned-suffix long-suffix(opt)
   long-suffix unsigned-suffix(opt)

unsigned-suffix: (§3.1.3.2) one of



u U

long-suffix: (§3.1.3.2) one of



l L

enumeration-constant: (§3.1.3.3)

   identifier

character-constant: (§3.1.3.4)

   ' c-char-sequence'
   L' c-char-sequence'

c-char-sequence: (§3.1.3.4)

   c-char
   c-char-sequence c-char

c-char: (§3.1.3.4)

   any member of the source character set except
      the single-quote ('), backslash (\), or new-line character
   escape-sequence

escape-sequence: (§3.1.3.4)

   simple-escape-sequence
   octal-escape-sequence
   hexadecimal-escape-sequence

simple-escape-sequence: (§3.1.3.4) one of


    \'  \"  \?  \\
    \a  \b  \f  \n  \r  \t  \v

octal-escape-sequence: (§3.1.3.4)

   \ octal-digit
   \ octal-digit octal-digit
   \ octal-digit octal-digit octal-digit

hexadecimal-escape-sequence:(§3.1.3.4)

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

A.1.1.5 String Literals

string-literal: (§3.1.4)

   "s-char-sequence(opt)"
   L"s-char-sequence(opt)"

s-char-sequence: (§3.1.4)

   s-char
   s-char-sequence s-char

s-char: (§3.1.4)

   any member of the source character set except
      the double-quote ("), backslash (\), or new-line character
   escape-sequence

A.1.1.6 Operators

operator: (§3.1.5) one of


    [  ]  (  )  .  ->
    ++  --  &  *  +  -  ~  !  sizeof
    /  %  <<  >>  <  >  <=  >=  ==  !=  ^  |  &&  ||
    ?  :
    =  *=  /=  %=  +=  -=  <<=  >>=  &=  ^=  |=
    ,  #  ##

A.1.1.7 Punctuators

punctuator: (§3.1.6) one of


    [  ]  (  )  {  }  *  ,  :  =  ;  ...  #

A.1.1.8 Header Names

header-name: (§3.1.7)

   <h-char-sequence>
   "q-char-sequence"

h-char-sequence: (§3.1.7)

   h-char
   h-char-sequence h-char

h-char: (§3.1.7)

   any member of the source character set except
      the new-line character and >

q-char-sequence: (§3.1.7)

   q-char
   q-char-sequence q-char

q-char: (§3.1.7)

   any member of the source character set except
      the new-line character and "

A.1.1.9 Preprocessing Numbers

pp-number: (§3.1.8)

   digit
   . digit
   pp-number digit
   pp-number nondigit
   pp-number  e sign
   pp-number  E sign
   pp-number .

A.1.2 Phrase Structure Grammar

A.1.2.1 Expressions

primary-expression: (§3.3.1)

   identifier
   constant
   string-literal
   ( expression )

postfix-expression: (§3.3.2)

   primary-expression
   postfix-expression [ expression ]
   postfix-expression ( argument-expression-
   list(opt) )
   postfix-expression . identifier
   postfix-expression -> identifier
   postfix-expression ++
   postfix-expression - -

argument-expression-list: (§3.3.2)

   assignment-expression
   argument-expression-list , assignment-expression

unary-expression: (§3.3.3)

   postfix-expression
   ++ unary-expression
   - - unary-expression
   unary-operator cast-expression
   sizeof unary-expression
   sizeof ( type-name )

unary-operator: (§3.3.3) one of


    &  *  +  -  ~  !

cast-expression: (§3.3.4)

   unary-expression
   ( type-name ) cast-expression

multiplicative-expression: (§3.3.5)

   cast-expression
   multiplicative-expression * cast-expression
   multiplicative-expression / cast-expression
   multiplicative-expression % cast-expression

additive-expression: (§3.3.6)

   multiplicative-expression
   additive-expression + multiplicative-expression
   additive-expression - multiplicative-expression

shift-expression: (§3.3.7)

   additive-expression
   shift-expression << additive-expression
   shift-expression >> additive-expression

relational-expression: (§3.3.8)

   shift-expression
   relational-expression < shift-expression
   relational-expression > shift-expression
   relational-expression <= shift-expression
   relational-expression >= shift-expression

equality-expression: (§3.3.9)

   relational-expression
   equality-expression == relational-expression
   equality-expression != relational-expression

AND-expression: (§3.3.10)

   equality-expression
   AND-expression & equality-expression

exclusive-OR-expression: (§3.3.11)

   AND-expression
   exclusive-OR-expression ^ AND-expression

inclusive-OR-expression: (§3.3.12)

   exclusive-OR-expression
   inclusive-OR-expression | exclusive-OR-expression

logical-AND-expression: (§3.3.13)

   inclusive-OR-expression
   logical-AND-expression && inclusive-OR-expression

logical-OR-expression: (§3.3.14)

   logical-AND-expression
   logical-OR-expression || logical-AND-expression

conditional-expression: (§3.3.15)

   logical-OR-expression
   logical-OR-expression ? expression : conditional-
   expression

assignment-expression: (§3.3.16)

   conditional-expression
   unary-expression assignment-operator assignment-
   expression

assignment-operator: (§3.3.16) one of


    =  *=  /=  %=  +=  -=  <<=  >>=  &=  ^=  |=

expression: (§3.3.17)

   assignment-expression
   expression , assignment-expression

constant-expression: (§3.4)

   conditional-expression

A.1.2.2 Declarations

declaration: (§3.5)

   declaration-specifiers init-declarator-list(opt) ;

declaration-specifiers: (§3.5)

   storage-class-specifier declaration-specifiers(opt)
   type-specifier declaration-specifiers(opt)
   type-qualifier declaration-specifiers(opt)

init-declarator-list: (§3.5)

   init-declarator
   init-declarator-list , init-declarator

init-declarator: (§3.5)

   declarator
   declarator = initializer

storage-class-specifier: (§3.5.1)

   typedef
   extern
   static
   auto
   register

type-specifier: (§3.5.2)

   void
   char
   short
   int
   long
   float
   double
   signed
   unsigned
   struct-or-union-specifier
   enum-specifier
   typedef-name

struct-or-union-specifier: (§3.5.2.1)

   struct-or-union identifier(opt) { struct-
   declaration-list }
   struct-or-union identifier

struct-or-union: (§3.5.2.1)

   struct
   union

struct-declaration-list: (§3.5.2.1)

   struct-declaration
   struct-declaration-list struct-declaration

struct-declaration: (§3.5.2.1)

   specifier-qualifier-list struct-declarator-list ;

specifier-qualifier-list: (§3.5.2.1)

   type-specifier specifier-qualifier-list(opt)
   type-qualifier specifier-qualifier-list(opt)

struct-declarator-list: (§3.5.2.1)

   struct-declarator
   struct-declarator-list , struct-declarator

struct-declarator: (§3.5.2.1)

   declarator
   declarator(opt) : constant-expression

enum-specifier: (§3.5.2.2)

   enum identifier(opt) { enumerator-list }
   enum identifier

enumerator-list: (§3.5.2.2)

   enumerator
   enumerator-list , enumerator

enumerator: (§3.5.2.2)

   enumeration-constant
   enumeration-constant = constant-expression

type-qualifier: (§3.5.3)

   const
   volatile

declarator: (§3.5.4)

   pointer(opt) direct-declarator

direct-declarator: (§3.5.4)

   identifier
   ( declarator )
   direct-declarator [ constant-expression(opt) ]
   direct-declarator ( parameter-type-list )
   direct-declarator ( identifier-list(opt) )

pointer: (§3.5.4)

   * type-qualifier-list(opt)
   * type-qualifier-list(opt) pointer

type-qualifier-list: (§3.5.4)

   type-qualifier
   type-qualifier-list type-qualifier

parameter-type-list: (§3.5.4)

   parameter-list
   parameter-list , ...

parameter-list: (§3.5.4)

   parameter-declaration
   parameter-list , parameter-declaration

parameter-declaration: (§3.5.4)

   declaration-specifiers declarator
   declaration-specifiers abstract-declarator(opt)

identifier-list: (§3.5.4)

   identifier
   identifier-list , identifier

type-name: (§3.5.5)

   specifier-qualifier-list abstract-declarator(opt)

abstract-declarator: (§3.5.5)

   pointer
   pointer(opt) direct-abstract-declarator

direct-abstract-declarator: (§3.5.5)

   ( abstract-declarator )
   direct-abstract-declarator(opt) [ constant-
   expression(opt) ]
   direct-abstract-declarator(opt) ( parameter-type-
   list(opt) )

typedef-name: (§3.5.6)

   identifier

initializer: (§3.5.7)

   assignment-expression
   { initializer-list }
   { initializer-list , }

initializer-list: (§3.5.7)

   initializer
   initializer-list , initializer

A.1.2.3 Statements

statement: (§3.6)

   labeled-statement
   compound-statement
   expression-statement
   selection-statement
   iteration-statement
   jump-statement

labeled-statement: (§3.6.1)

   identifier : statement
   case constant-expression : statement
   default : statement

compound-statement: (§3.6.2)

   { declaration-list(opt) statement-list(opt) }

declaration-list: (§3.6.2)

   declaration
   declaration-list declaration

statement-list: (§3.6.2)

   statement
   statement-list statement

expression-statement: (§3.6.3)

   expression(opt) ;

selection-statement: (§3.6.4)

   if ( expression ) statement
   if ( expression ) statement else statement
   switch ( expression) statement

iteration-statement: (§3.6.5)

   while ( expression ) statement
   do  statement  while ( expression ) ;
   for (  expression(opt) ; expression(opt) ;
   expression(opt) ) statement

jump-statement: (§3.6.6)

   goto identifier ;
   continue ;
   break ;
   return expression(opt) ;

A.1.2.4 External Definitions

translation-unit: (§3.7)

   external-declaration
   translation-unit external-declaration

external-declaration: (§3.7)

   function-definition
   declaration

function-definition: (§3.7.1)

   declaration-specifiers(opt) declarator declaration-
   list(opt) compound-statement

A.1.3 Preprocessing Directives

preprocessing-file: (§3.8)

   group(opt)

group: (§3.8)

   group-part
   group group-part

group-part: (§3.8)

   pp-tokens(opt) new-line
   if-section
   control-line

if-section: (§3.8.1)

   if-group elif-groups(opt) else-group(opt)
   endif-line

if-group: (§3.8.1)

   #if constant-expression new-line group(opt)
   #ifdef identifier new-line group(opt)
   #ifndef identifier new-line group(opt)

elif-groups: (§3.8.1)

   elif-group
   elif-groups elif-group

elif-group: (§3.8.1)

   #elif constant-expression new-line group(opt)

else-group: (§3.8.1)

   #else new-line group(opt)

endif-line: (§3.8.1)

   #endif new-line

control-line:

   #include pp-tokens new-line (§3.8.2)
   #define identifier replacement-list new-line (§3.8.3)
   #define identifier (identifier-list)(opt) 
   replacement-list new-line (§3.8.3)
   #undef identifier new-line (§3.8.3)
   #line pp-tokens new-line (§3.8.4)
   #error pp-tokens(opt) new-line (§3.8.5)
   #pragma pp-tokens(opt) new-line (§3.8.6)
   # new-line (§3.8.7)

lparen: (§3.8.3)

   the left parenthesis character without preceding white space

replacement-list: (§3.8.3)

   pp-tokens(opt)

pp-tokens: (§3.8)

   preprocessing-token
   pp-tokens preprocessing-token

new-line: (§3.8)

   the new-line character


Previous Page | Next Page | Table of Contents | Index