D Grammar
The grammar of Cyclone is derived from ISO C99.
It has the following additional keywords:
abstract, catch,
codegen, cut, fallthru, fill,
let, malloc,
namespace, new, NULL,
region_t, regions,
rmalloc, rnew, splice,
throw, try, tunion, using,
xtunion. As in gcc,
__attribute__ is reserved as well.
The non-terminals
character-constant,
floating-constant,
identifier,
integer-constant,
string,
type-var,
and
typedef-name
are defined lexically as in C.
The start symbol is translation-unit.
Jump to: declaration ·
struct-or-union-specifier ·
tunion-specifier ·
statement ·
expression ·
declarator ·
pattern
- translation-unit:
-
(empty)
external-declaration translation-unitopt
using identifier ; translation-unit
namespace identifier ; translation-unit
using identifier { translation-unit } translation-unit
namespace identifier { translation-unit } translation-unit
extern string { translation-unit } 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 ;
let identifier-list ;
- 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
- type-specifier:
-
_
void
char
short
int
long
float
double
signed
unsigned
enum-specifier
struct-or-union-specifier
tunion-specifier
typedef-name type-paramsopt
type-var
type-var :: kind
$( parameter-list )
region_t < any-type-name >
- kind:
-
identifier
typedef-name
- type-qualifier: one of
-
const
restrict
volatile
- enum-specifier:
-
enum identifier { enum-declaration-list }
enum identifier
- enum-field:
-
identifier
identifier = constant-expression
- enum-declaration-list:
-
enum-field
enum-field , enum-declaration-list
- 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
- tunion-specifier:
-
tunion-or-xtunion identifier type-paramsopt { tunionfield-list }
tunion-or-xtunion regionopt identifier type-paramsopt
tunion-or-xtunion identifier . identifier type-paramsopt
- tunion-or-xtunion: one of
-
tunion
xtunion
- tunionfield-list:
-
tunionfield
tunionfield ;
tunionfield , tunionfield-list
tunionfield ; tunionfield-list
- tunionfield-scope: one of
-
extern
static
- tunionfield:
-
tunionfield-scope identifier
tunionfield-scope identifier type-paramsopt ( parameter-list )
- declarator:
-
pointeropt direct-declarator
- direct-declarator:
-
identifier
( declarator )
direct-declarator [ assignment-expressionopt ]
direct-declarator ( parameter-type-list )
direct-declarator ( ; effect-set )
direct-declarator ( identifier-listopt )
direct-declarator < type-name-list >
- pointer:
-
* rangeopt regionopt type-qualifier-listopt pointeropt
@ rangeopt regionopt type-qualifier-listopt pointeropt
? regionopt type-qualifier-listopt pointeropt
- range:
-
{ assignment-expression }
- region:
-
_
'H
type-var
type-var :: kind
- type-qualifier-list:
-
type-qualifier
type-qualifier-list type-qualifier
- parameter-type-list:
-
parameter-list
parameter-list , ...
- optional-effect:
-
(empty)
; effect-set
- optional-inject:
-
(empty)
identifier
- effect-set:
-
atomic-effect
atomic-effect + effect-set
- atomic-effect:
-
{ }
{ region-set }
type-var
type-var :: kind
- region-set:
-
type-var
type-var , region-set
type-var :: kind
type-var :: kind , region-set
- 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
array-initializer
- array-initializer:
-
{ initializer-listopt }
{ initializer-list , }
{ for identifier < expression : expression }
- 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
- any-type-name:
-
type-name
{ }
{ region-set }
any-type-name + atomic-effect
- type-name-list:
-
type-name
type-name-list , type-name
- abstract-declarator:
-
pointer
pointeropt direct-abstract-declarator
- direct-abstract-declarator:
-
( abstract-declarator )
direct-abstract-declaratoropt [ assignment-expressionopt ]
direct-abstract-declaratoropt ( parameter-type-listopt )
direct-abstract-declaratoropt ( ; effect-set )
direct-abstract-declaratoropt [ ? ]
direct-abstract-declarator < type-name-list >
- statement:
-
labeled-statement
expression-statement
compound-statement
selection-statement
iteration-statement
jump-statement
region identifier statement
region < type-var > identifier statement
cut statement
splice statement
- 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 && expression : block-item-listopt switch-clauses
- 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 ;
return expression ;
fallthru ;
fallthru ( argument-expression-listopt ) ;
- pattern:
-
_
( pattern )
integer-constant
- integer-constant
floating-constant
character-constant
NULL
identifier
identifier type-paramsopt ( tuple-pattern-list )
$( tuple-pattern-list )
identifier type-paramsopt { }
identifier type-paramsopt { field-pattern-list }
& pattern
* identifier
- tuple-pattern-list:
-
(empty)
pattern
tuple-pattern-list , pattern
- field-pattern:
-
pattern
designation pattern
- field-pattern-list:
-
field-pattern
field-pattern-list , field-pattern
- expression:
-
assignment-expression
expression , assignment-expression
- assignment-expression:
-
conditional-expression
unary-expression assignment-operator assignment-expression
- assignment-operator: one of
-
=
*=
/=
%=
+=
-=
<<=
>>=
&=
^=
|=
- conditional-expression:
-
logical-or-expression
logical-or-expression ? expression : conditional-expression
throw conditional-expression
new array-initializer
new logical-or-expression
rnew ( expression ) array-initializer
rnew ( expression ) logical-or-expression
- constant-expression:
-
conditional-expression
- logical-or-expression:
-
logical-and-expression
logical-or-expression || logical-and-expression
- logical-and-expression:
-
inclusive-or-expression
logical-and-expression && inclusive-or-expression
- inclusive-or-expression:
-
exclusive-or-expression
inclusive-or-expression | exclusive-or-expression
- exclusive-or-expression:
-
and-expression
exclusive-or-expression
^
and-expression
- and-expression:
-
equality-expression
and-expression & equality-expression
- equality-expression:
-
relational-expression
equality-expression == relational-expression
equality-expression != relational-expression
- relational-expression:
-
shift-expression
relational-expression < shift-expression
relational-expression > shift-expression
relational-expression <= shift-expression
relational-expression >= shift-expression
- shift-expression:
-
additive-expression
shift-expression << additive-expression
shift-expression >> additive-expression
- additive-expression:
-
multiplicative-expression
additive-expression + multiplicative-expression
additive-expression - multiplicative-expression
- multiplicative-expression:
-
cast-expression
multiplicative-expression * cast-expression
multiplicative-expression / cast-expression
multiplicative-expression % cast-expression
- cast-expression:
-
unary-expression
( type-name ) cast-expression
- unary-expression:
-
postfix-expression
++ unary-expression
-- unary-expression
unary-operator cast-expression
sizeof unary-expression
sizeof ( type-name )
expression . size
- unary-operator: one of
-
&
*
+
-
~
!
- postfix-expression:
-
primary-expression
postfix-expression [ expression ]
postfix-expression ( )
postfix-expression ( argument-expression-list )
postfix-expression . identifier
postfix-expression -> identifier
postfix-expression ++
postfix-expression --
( type-name ) { initializer-list }
( type-name ) { initializer-list , }
fill ( expression )
codegen ( function-definition )
- primary-expression:
-
identifier
constant
string
( expression )
identifier <>
identifier @ < type-name-list >
$( argument-expression-list )
identifier { initializer-list }
( { block-item-list } )
- argument-expression-list:
-
assignment-expression
argument-expression-list , assignment-expression
- constant:
-
integer-constant
character-constant
floating-constant
NULL