Quick links: declaration, struct-or-union-specifier, enum-specifier, declarator, statement, pattern, expression
translation-unit:
external-declaration translation-unitopt
using
identifier ;
translation-unit
namespace
identifier ;
translation-unit
using
identifier {
translation-unit }
namespace
identifier {
translation-unit }
external-declaration:
function-definition
declaration
function-definition:
declaration-specifiersopt declarator declaration-listopt compound-statement
declaration:
declaration-specifiers init-declarator-listopt
;
let
pattern =
expression ;
declaration-list:
declaration
declaration-list declaration
declaration-specifiers:
storage-class-specifier declaration-specifiersopt
type-specifier declaration-specifiersopt
type-qualifier declaration-specifiersopt
function-specifier declaration-specifiersopt
storage-class-specifier: one of
auto
register
static
extern
typedef
abstract
(The C9X type-specifiers
_Bool
,
_Complex
, and
_Imaginary
are not yet supported)
type-specifier: one of
void
char
short
int
long
float
double
signed
unsigned
struct-or-union-specifier
enum-specifier
typedef-name type-paramsopt
type-var
bool
Bool
Char
Short
Int
Long
Float
Double
$
(
parameter-list )
type-qualifier: one of
const
restrict
volatile
function-specifier:
inline
struct-or-union-specifier:
struct-or-union
{
struct-declaration-list }
struct-or-union identifier type-paramsopt {
struct-declaration-list }
struct-or-union identifier type-paramsopt
type-params:
<
type-name-list >
struct-or-union: one of
struct
union
struct-declaration-list:
struct-declaration
struct-declaration-list struct-declaration
init-declarator-list:
init-declarator
init-declarator-list ,
init-declarator
init-declarator:
declarator
declarator =
initializer
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
{
enumerator-list }
enum
identifier type-paramsopt {
enumerator-list }
enum
identifier type-paramsopt
xenum
identifier {
enumerator-list }
xenum
identifier
enumerator-list:
enumerator
enumerator ,
enumerator-list
enumerator ;
enumerator ;
enumerator-list
enumerator:
identifier
identifier =
constant-expression
identifier (
parameter-list )
declarator:
pointeropt direct-declarator
(We do not support C9X [*]
direct-declarators.)
direct-declarator:
identifier
(
declarator )
direct-declarator [
constant-expressionopt ]
direct-declarator (
parameter-type-list )
direct-declarator (
identifier-listopt )
direct-declarator [
?
]
direct-declarator <
type-name-list >
pointer:
*
type-qualifier-listopt pointeropt
@
type-qualifier-listopt pointeropt
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:
specifier-qualifier-list declarator
specifier-qualifier-list abstract-declaratoropt
identifier-list:
identifier
identifier-list ,
identifier
initializer:
assignment-expression
{
initializer-listopt }
{
initializer-list ,
}
initializer-list:
designationopt initializer
initializer-list ,
designationopt initializer
designation:
designator-list
=
designator-list:
designator
designator-list designator
designator:
[
constant-expression ]
.
identifier
type-name:
specifier-qualifier-list abstract-declaratoropt
type-name-list:
type-name
type-name-list ,
type-name
abstract-declarator:
pointer
pointeropt direct-abstract-declarator
(We do not support C9X [*]
direct-abstract-declarators.)
direct-abstract-declarator:
(
abstract-declarator )
direct-abstract-declaratoropt [
constant-expressionopt ]
direct-abstract-declaratoropt (
parameter-type-listopt )
direct-abstract-declaratoropt [
?
]
direct-abstract-declarator <
type-name-list >
statement:
labeled-statement
expression-statement
compound-statement
selection-statement
iteration-statement
jump-statement
cut
statement
splice
statement
(We treat the
case
and default
labels specially;
see switch-clauses
)
labeled-statement:
identifier
:
statement
expression-statement:
expressionopt
;
compound-statement:
{
block-item-listopt }
block-item-list:
block-item
block-item block-item-list
block-item:
declaration
statement
selection-statement:
if
(
expression )
statement
if
(
expression )
statement else
statement
switch
(
expression )
{
switch-clauses }
try
statement catch
{
switch-clauses }
switch-clauses:
(empty)
default
:
block-item-list
case
pattern :
block-item-listopt switch-clauses
case
pattern where
expression :
block-item-listopt switch-clauses
iteration-statement:
while
(
expression )
statementdo
statement while
(
expression )
;
for
(
expressionopt ;
expressionopt ;
expressionopt )
statementfor
(
declaration expressionopt ;
expressionopt )
statementgoto
identifier ;
continue
;
break
;
return
;
return
expression ;
fallthru
;
_
(
pattern )
-
integer-constantnull
true
false
(
tuple-pattern-list )
$
(
tuple-pattern-list )
{
}
{
field-pattern-list }
&
pattern,
pattern,
field-pattern,
assignment-expression=
*=
/=
%=
+=
-=
<<=
>>=
&=
^=
|=
?
expression :
conditional-expression||
logical-and-expression&&
inclusive-or-expression|
exclusive-or-expression^
and-expression&
equality-expression==
relational-expression!=
relational-expression<
shift-expression>
shift-expression<=
shift-expression>=
shift-expression<<
additive-expression>>
additive-expression+
multiplicative-expression-
multiplicative-expression*
cast-expression/
cast-expression%
cast-expression(
type-name )
cast-expression++
unary-expression--
unary-expressionsizeof
unary-expressionsizeof
(
type-name )
raise
unary-expression&
*
+
-
~
!
[
expression ]
(
)
(
argument-expression-list )
.
identifier->
identifier++
--
( type-name ) { initializer-list }
( type-name ) { initializer-list , }
new
{
initializer-listopt }
new
{
initializer-list ,
}
new
{
for
identifier <
expression :
expression }
fill
(
expression )
codegen
(
function-definition )
(
expression )
<>
$
(
argument-expression-list )
{
initializer-list }
(
{
block-item-list }
)
,
assignment-expressiontrue
false
null