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!
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