C Grammar

ISO/IEC 9899:1999

Note: items ending in "opt" are optional

Example specification:

argument-expression-listopt:
	/* nothing */
	argument-expression-list

Terminals are in bold

A.2.1 Expressions
---

primary-expression:
	identifier
	constant
	string-literal
	( expression )
	
postfix-expression:
	primary-expression
	postfix-expression [ expression ]
	postfix-expression ( argument-expression-listopt )
	postfix-expression . identifier
	postfix-expression -> identifier
	postfix-expression ++
	postfix-expression --
	( type-name ) { initializer-list }
	( type-name ) { initializer-list , }

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

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

unary-operator: one of
	& * + - ~ !

cast-expression:
	unary-expression
	( type-name ) cast-expression

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

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

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

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

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

AND-expression:
	equality-expression
	AND-expression & equality-expression

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

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

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

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

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

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

assignment-operator: one of
	= *= /= %= += -= <<= >>= &= ^= |=

expression:
	assignment-expression
	expression , assignment-expression

constant-expression:
	conditional-expression


A.2.2 Declarations
---

declaration:
	declaration-specifiers init-declarator-listopt ;

declaration-specifiers:
	storage-class-specifier declaration-specifiersopt
	type-specifier declaration-specifiersopt
	type-qualifier declaration-specifiersopt
	function-specifier declaration-specifiersopt

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

init-declarator:
	declarator
	declarator = initializer

storage-class-specifier:
	typedef
	extern
	static
	auto
	register

type-specifier:
	void
	char
	short
	int
	long
	float
	double
	signed
	unsigned
	_Bool
	_Complex
	_Imaginary
	struct-or-union-specifier
	enum-specifier
	typedef-name

struct-or-union-specifier:
	struct-or-union identifieropt { struct-declaration-list }
	struct-or-union identifier

struct-or-union:
	struct
	union

struct-declaration-list:
	struct-declaration
	struct-declaration-list struct-declaration

struct-declaration:
	specifier-qualifier-list struct-declarator-list ;

specifier-qualifier-list:
	type-specifier specifier-qualifier-listopt
	type-qualifier specifier-qualifier-listopt


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

struct-declarator:
	declarator
	declaratoropt : constant-expression

enum-specifier:
	enum identifieropt { enumerator-list }
	enum identifieropt { enumerator-list , }
	enum identifier

enumerator-list:
	enumerator
	enumerator-list , enumerator

enumerator:
	enumeration-constant
	enumeration-constant = constant-expression

type-qualifier:
	const
	restrict
	volatile

function-specifier:
	inline

declarator:
	pointeropt direct-declarator

direct-declarator:
	identifier
	( declarator )
	direct-declarator [ type-qualifier-listopt assignment-expressionopt ]
	direct-declarator [ static type-qualifier-listopt assignment-expression ]
	direct-declarator [ type-qualifier-list static assignment-expression ]
	direct-declarator [ type-qualifier-listopt * ]
	direct-declarator ( parameter-type-list )
	direct-declarator ( identifier-listopt )

pointer:
	* type-qualifier-listopt
	* type-qualifier-listopt pointer

type-qualifier-list:
	type-qualifier
	type-qualifier-list type-qualifier

parameter-type-list:
	parameter-list
	parameter-list , ...

parameter-list:
	parameter-declaration
	parameter-list , parameter-declaration

parameter-declaration:
	declaration-specifiers declarator
	declaration-specifiers abstract-declaratoropt

identifier-list:
	identifier
	identifier-list , identifier

type-name:
	specifier-qualifier-list abstract-declaratoropt

abstract-declarator:
	pointer
	pointeropt direct-abstract-declarator

direct-abstract-declarator:
	( abstract-declarator )
	direct-abstract-declaratoropt [ assignment-expressionopt ]
	direct-abstract-declaratoropt [ * ]
	direct-abstract-declaratoropt ( parameter-type-listopt )

typedef-name:
	identifier

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

initializer-list:
	designationopt initializer
	initializer-list , designationopt initializer

designation:
	designator-list =

designator-list:
	designator
	designator-list designator

designator:
	[ constant-expression ]
	. identifier


A.2.3 Statements
---

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

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

compound-statement:
	{ block-item-listopt }

block-item-list:
	block-item
	block-item-list block-item

block-item:
	declaration
	statement

expression-statement:
	expressionopt ;

selection-statement:
	if ( expression ) statement
	if ( expression ) statement else statement
	switch ( expression ) statement

iteration-statement:
	while ( expression ) statement
	do statement while ( expression ) ;
	for ( expressionopt ; expressionopt ; expressionopt ) statement
	for ( declaration expressionopt ; expressionopt ) statement

jump-statement:
	goto identifier ;
	continue ;
	break ;
	return expressionopt ;

A.2.4 External definitions
---

translation-unit:
	external-declaration
	translation-unit external-declaration

external-declaration:
	function-definition
	declaration

function-definition:
	declaration-specifiers declarator declaration-listopt compound-statement

declaration-list:
	declaration
	declaration-list declaration