C Grammar

This is an annotated and partially modified grammar, based on MSC, gcc and other sources.


translation_unit : {external_declaration}

external_declaration :       /* Allowed only at external (file) scope */
    function_definition
  | declaration

declaration :
    declaration_specifiers [attribute_seq] [init_declarator_list] ";"

attribute_seq :            /* attribute_seq is Microsoft Specific */
        {__asm | __fastcall | __based | __inline | __cdecl | __stdcall }

init_declarator_list : init_declarator {"," init_declarator}
init_declarator : declarator ["=" initializer] /* For scalar initialization */

        initializer :
            assignment_expression
          | "{" initializer_list [","] "}"  /* For aggregate initialization */

            initializer_list : initializer {"," initializer}

declaration_specifiers :
    +{storage_class_specifier | type_specifier | type_qualifier}

storage_class_specifier :
        auto | register | static | extern | typedef
      | __declspec "(" extended_decl_modifier_seq ")" /* Microsoft Specific */

declarator : [pointer] direct_declarator
direct_declarator :
        identifier
      | "(" declarator ")"
      | direct_declarator "[" [constant_expression] "]"
      | direct_declarator "(" parameter_type_list ")"   /* New_style declarator */
      | direct_declarator "(" [identifier_list] ")"      /* Obsolete_style declarator */

        identifier_list : identifier {"," identifier}

abstract_declarator :         /* Used with anonymous declarators */
    pointer [ direct_abstract_declarator ]
  | direct_abstract_declarator

direct_abstract_declarator :
        "(" abstract_declarator ")"
      | [direct_abstract_declarator] "[" [constant_expression] "]"
      | [direct_abstract_declarator] "(" [parameter_type_list] ")"

parameter_type_list : parameter_list ["," | "..."]

parameter_list : parameter_declaration {"," parameter_declaration}

parameter_declaration :
    declaration_specifiers declarator            /* Named declarator */
  | declaration_specifiers [abstract_declarator] /* Anonymous declarator */

pointer : +{"*" {type_qualifier} }    //???really multiple???

type_qualifier : const | volatile

type_specifier :
    void | char | short | int | long | float | double | signed | unsigned
  | __int8 | __int16 | __int32 | __int64      /* Microsoft Specific */
  | struct_or_union_specifier
  | enum_specifier
  | typedef_name    //identifier from typedef

specifier_qualifier_list : +{ type_specifier | type_qualifier }


enum_specifier :
    "enum" enumerator_list
  | "enum" identifier [enumerator_list]

    enumerator_list : "{" enumerator {"," enumerator}  "}"
        enumerator : identifier ["=" constant_expression]

struct_or_union_specifier :
    struct_or_union [identifier] "{" struct_declaration_list "}"
  | struct_or_union identifier

    struct_or_union : struct | union

    struct_declaration_list : +{struct_declaration}
        struct_declaration : specifier_qualifier_list struct_declarator_list ";"
            struct_declarator_list : struct_declarator {"," struct_declarator}
                struct_declarator :
                   declarator
                  | type_specifier [declarator] ":" constant_expression //bitfield!



function_definition :
    [declaration_specifiers] declarator {declaration} compound_statement
        //missing declaration_specifiers default to "int"
        //declarator here is the function declarator
        //declaration_list for old style definition (arguments)

compound_statement : "{" [declaration_list] +{statement} "}"

statement :
    labeled_statement
  | compound_statement
  | expression_statement
  | selection_statement
  | iteration_statement
  | jump_statement
  | try_statement

labeled_statement :
    identifier ":" statement
  | "case" constant_expression ":" statement
  | "default" ":" statement

jump_statement :
    "goto" identifier ";"
  | "continue;"
  | "break;"
  | "return" [expression] ";"

expression_statement : [expression] ";"

iteration_statement :
    "while" "(" expression ")" statement
  | "do" statement "while" "(" expression ");"
  | "for" "(" [expression] ";" [expression] ";" [expression] ")" statement

selection_statement :
    "if" "(" expression ")" statement ["else" statement]
  | "switch" "(" expression ")" statement

try_statement :   /* Microsoft Specific */
    "__try" compound_statement "__except" "(" expression ")" compound_statement
  | "__try" compound_statement "__finally" compound_statement


expression : assignment_expression { "," assignment_expression }
//argument_expression_list : assignment_expression { "," assignment_expression }

assignment_expression :
    conditional_expression    //not recursive!
  | unary_expression assignment_operator assignment_expression
  | logical_OR_expression assignment_operator assignment_expression    //C99!!!

    assignment_operator : "="|"*="|"/="|"%="|"+="|"-="|"<<="|">>="|"&="|"^="|"|="

constant_expression : conditional_expression

conditional_expression : logical_OR_expression [ "?" expression ":" conditional_expression ]
logical_OR_expression : logical_AND_expression { "||" logical_AND_expression }
logical_AND_expression : inclusive_OR_expression { "&&" inclusive_OR_expression }
inclusive_OR_expression : exclusive_OR_expression { "|" exclusive_OR_expression }
exclusive_OR_expression : AND_expression { "^" AND_expression }
AND_expression : equality_expression { "&" equality_expression }
equality_expression : relational_expression { ("==" | "!=") relational_expression }
relational_expression : shift_expression { ("<" | ">" | "<=" | ">=") shift_expression }
shift_expression : additive_expression { ("<<" | ">>") additive_expression }
additive_expression : multiplicative_expression { ("+" | "-") multiplicative_expression }
multiplicative_expression : cast_expression { ( "*" | "/" | "%") cast_expression }

cast_expression : { "(" type_name ")" } unary_expression

unary_expression :
    "++" unary_expression
  | "--" unary_expression
  | unary_operator cast_expression
  | postfix_expression

    unary_operator : "&" | "*" | "+" | "-" | "~" | "!"

postfix_expression :
    primary_expression
    {     "[" expression "]"
      |   "(" [expression] ")"    //=argument_expression_list!!!
      |   "." identifier
      |   "->" identifier
      |   "++"
      |   "--"
    }
primary_expression :
    identifier | constant | string_literal
  | "sizeof" unary_expression
  | "sizeof" "(" type_name ")"
  | "(" expression ")"

type_name : specifier_qualifier_list [abstract_declarator]
    //use: in sizeof and cast_expression

/* occurences of "("
    in cast_expression: (type_name) repeatable!!!
    in postfix_expression: as (expression), followed by (argument_expression_list) repeatable
-> in cast_expression, if NOT followed by type_name -> postfix_expression [flag: "(" already consumed]???
*/


extended_decl_modifier_seq : /*   Microsoft Specific */
{extended_decl_modifier}

extended_decl_modifier :   /* Microsoft Specific */
thread
naked
dllimport
dllexport

fölaksjdfladf