SaC EBNF Grammar
November 2, 2016
1 Program Structure
prg | [ global_pragma ] [ ( module class ) ] [ interface ] | |
[ tfspec ] [ structdef ] [ typedef ] [ objectdef ] | ||
[ function ] |
2 Module Declarations
module | module id [ deprecated str ] ; | |
class | class id [ deprecated str ] ; classtype | |
classtype | classtype type ; | |
extern classtype ; [ interface_pragma ] |
3 Import / Export
interface | ( import use ) id : symbolset ; | |
( export provide ) symbolset ; | ||
symbolset | all [ except { ext_id [ , ext_id ] } ] | |
{ ext_id [ , ext_id ] } |
4 Structure Definitions (future use)
structdef | struct id { [ type id [ , id ] ; ] } ; |
5 Type Definitions
typedef | builtintypedef | |
loctypedef | ||
exttypedef | ||
absttypedef | ||
typerel | ||
builtintypedef | builtin typedef [ typecompspec ] id [ typeargs ] ; | |
loctypedef | typedef [ typecompspec ] type id ; | |
exttypedef | external typedef [ typecompspec ] id ; [ interface_pragma ] | |
absttypedef | typedef [ typecompspec ] id ; | |
typecompspec | [ id ] | |
typeargs | ( id [ , id ] ) | |
typerel | typerel id [ , id ] <: id ; | |
typerel id [ typeargs ] <: id [ typeargs ] [ | typerelexpr ] ; | ||
typerelexpr | ( typerelexpr ) | |
typerelexpr <= typerelexpr | ||
typerelexpr >= typerelexpr | ||
typerelexpr == typerelexpr | ||
typerelexpr && typerelexpr | ||
id |
6 Object Definitions
objectdef | ( locobjdef extobjdef ) | |
locobjdef | objdef type id = funcall ; | |
extobjdef | external objdef type id ; [ interface_pragma ] |
7 Function Declarations and Definitions
function | extfundec [ ( interface_pragma funtion_pragma ) ] | |
specfundec [ function_pragma ] | ||
fundef | ||
main | ||
extfundec | external varsignature ; | |
specfundec | specialize fixsignature ; | |
fundef | [ inline ] [ thread ] fixsignature [ function_pragma ] body | |
fixsignature | fixrets ext_id ( fixargs ) | |
operator_sig | ||
varsignature | varrets ext_id ( varargs ) | |
operator_sig | ||
operator_sig | type ( ext_op ) ( arg ) | |
type ( ext_op ) ( arg , arg ) | ||
fixargs | ( arg [ , arg ] [ void ] ) | |
varargs | fixargs | |
arg [ , arg ] , ... | ||
arg | type [ & ] id | |
fixrets | ( type [ , type ] [ void ] ) | |
varrets | fixrets | |
type [ , type ] , ... | ||
main | int main ( [ void ] ) body |
8 Function Bodies
body | { [ cachesim_pragma ] [ vardec ] [ statement ] [ return ] } | |
vardec | type id [ , id ] ; | |
statement | ; | |
assignment ; | ||
funcall ; | ||
withloop ; | ||
cond | ||
doloop | ||
whileloop | ||
forloop | ||
return | return [ expr ] ; | |
return ( [ exprs ] ) ; | ||
assignment | assign_lhs [ , assign_lhs ] assign_op expr | |
assign_lhs ( ++ -- ) | ||
assign_lhs | id | |
assign_lhs . id | ||
assign_lhs [ exprs ] | ||
assign_op | ( = += -= *= /= %= ) | |
cond | if ( expr ) statementblock [ else statementblock ] | |
doloop | do statementblock while ( expr ) ; | |
whileloop | while ( expr ) statementblock | |
forloop | for ( assignment [ , assignment ] | |
; expr ; assignment [ , assignment ] ) | ||
statementblock | ||
statementblock | { [ cachesim_pragma ] [ statement ] } | |
statement |
9 Expressions
exprs | expr [ , expr ] | |
expr_or_dot | ( expr . ) | |
expr_or_mdot | ( expr . ... ) | |
expr | const | |
qual_ext_id | ||
funcall | ||
withloop | ||
set_notation | ||
array | ||
struct | ||
expr || expr | ||
expr && expr | ||
expr ? expr : expr | ||
( type ) expr | ||
( expr ) | ||
arrray | [ [ exprs ] ] | |
[ : type ] | ||
expr [ [ expr_or_mdot [ , expr_or_mdot ] ] ] | ||
struct | < exprs > | |
expr . id | ||
funcall | qual_ext_id ( [ exprs ] ) | |
spawn [ ( str ) ] qual_ext_id ( [ exprs ] ) | ||
rspawn [ ( str ) ] qual_ext_id ( [ exprs ] ) | ||
unary_prf ( expr ) | ||
qual_ext_op expr | ||
binary_prf ( expr , expr ) | ||
expr qual_ext_op expr | ||
ternary_prf ( expr , expr , expr ) | ||
set_notation | { id -> expr } | |
{ [ [ id_or_mdot [ , id_or_mdot ] ] ] -> expr } |
10 With-Loops
withloop | [ local ] with [ generators ] : operations | |
generators | { [ withloop_pragma ] [ generator ] } | |
generator | ( index_set ) [ { [ statement ] } ] : gen_exprs ; | |
index_set | expr_or_dot ( < <= ) index_vars ( < <= ) expr_or_dot | |
[ step expr [ width expr ] ] | ||
index_vars | id [ = id_vec ] | |
id_vec | ||
id_vec | [ [ id [ , id ] ] ] | |
gen_exprs | void | |
expr | ||
( expr [ , expr ] ) | ||
operations | void | |
operation | ||
( operation [ , operation ] ) | ||
operation | genarray ( expr [ , expr ] ) | |
modarray ( expr ) | ||
fold ( ( qual_ext_id qual_ext_op ) [ ( exprs ) ] , expr ) | ||
foldfix ( ( qual_ext_id qual_ext_op ) [ ( exprs ) ] , expr , expr ) | ||
propagate ( id ) |
11 Types
type | basetype [ shape_spec ] | |
shape_spec | [ * ] | |
[ + ] | ||
[ [ . [ , . ] ] ] | ||
[ [ num [ , num ] ] ] | ||
basetype | simpletype | |
usertype | ||
simpletype | byte | |
short | ||
int | ||
long | ||
longlong | ||
ubyte | ||
ushort | ||
uint | ||
ulong | ||
ulonglong | ||
float | ||
bool | ||
char | ||
double | ||
usertype | ( [ struct ] id :: ) id | |
polytype | < id [ = id [ id ] ] > | |
< id ( -> <- ) id [ id ] > |
12 Identifiers
id_or_mdot | ( id . ... ) | |
qual_ext_id | [ id :: ] ext_id | |
ext_id | ( id reservedid ) | |
reservedid | genarray | |
modarray | ||
fold | ||
foldfix | ||
propagate | ||
all | ||
except | ||
qual_ext_op | [ id :: ] ext_op | |
ext_op | ( op reservedop ) | |
reservedop | & | |
&& | ||
|| | ||
! | ||
~ | ||
+ | ||
- | ||
* | ||
/ | ||
% | ||
<= | ||
< | ||
>= | ||
> | ||
>> | ||
<< | ||
^ | ||
++ | ||
-- |
13 Constants
const | numbyte | |
numshort | ||
numint | ||
numlong | ||
numlonglong | ||
numubyte | ||
numushort | ||
numuint | ||
numulong | ||
numulonglong | ||
num | ||
float | ||
double | ||
char | ||
[ str ] | ||
true | ||
false |
14 Builtin Operations
unary_prf | ( _tob_S_ _tos_S_ _toi_S_ _tol_S_ _toll_S_ ) | |
( _toub_S_ _tous_S_ _toui_S_ _toul_S_ _toull_S_ ) | ||
_tof_S_ | ||
_tod_S_ | ||
_toc_S_ | ||
_tobool_S_ | ||
( _not_S_ _not_V_ ) | ||
( _neg_S_ _neg_V_ ) | ||
( _abs_S_ _abs_V_ ) | ||
_dim_A_ | ||
_shape_A_ | ||
ternary_prf | _modarray_AxVxS_ | |
binary_prf | ( _add_SxS_ _add_SxV_ _add_VxS_ _add_VxV_ ) | |
( _sub_SxS_ _sub_SxV_ _sub_VxS_ _sub_VxV_ ) | ||
( _mul_SxS_ _mul_SxV_ _mul_VxS_ _mul_VxV_ ) | ||
( _div_SxS_ _div_SxV_ _div_VxS_ _div_VxV_ ) | ||
( _mod_SxS_ _mod_SxV_ _mod_VxS_ _mod_VxV_ ) | ||
( _min_SxS_ _min_SxV_ _min_VxS_ _min_VxV_ ) | ||
( _max_SxS_ _max_SxV_ _max_VxS_ _max_VxV_ ) | ||
( _eq_SxS_ _eq_SxV_ _eq_VxS_ _eq_VxV_ ) | ||
( _neq_SxS_ _neq_SxV_ _neq_VxS_ _neq_VxV_ ) | ||
( _le_SxS_ _le_SxV_ _le_VxS_ _le_VxV_ ) | ||
( _lt_SxS_ _lt_SxV_ _lt_VxS_ _lt_VxV_ ) | ||
( _ge_SxS_ _ge_SxV_ _ge_VxS_ _ge_VxV_ ) | ||
( _gt_SxS_ _gt_SxV_ _gt_VxS_ _gt_VxV_ ) | ||
( _and_SxS_ _and_SxV_ _and_VxS_ _and_VxV_ ) | ||
( _or_SxS_ _or_SxV_ _or_VxS_ _or_VxV_ ) | ||
_reshape_VxA_ | ||
_sel_VxA_ | ||
_take_SxV_ | ||
_drop_SxV_ | ||
_cat_VxV_ | ||
secret_prf | _hideValue_SxA_ | |
_hideShape_SxA_ | ||
_hideDim_SxA_ | ||
_sel_VxIA_ | ||
( _reciproc_S_ _reciproc_V_ ) | ||
_mask_VxVxV_ | ||
( _non_neg_val_S_ _non_neg_val_V_ ) | ||
( _val_le_val_SxS_ _val_le_val_VxV_ ) |
15 Pragmas
global_pragma | # pragma main-aspect qual_ext_id [ , qual_ext_id ] | |
interface_pragma | # pragma linkname str | |
# pragma cudalinkname [ str ] | ||
# pragma linkwith [ str ] | ||
# pragma linkobj [ str ] | ||
# pragma copyfun str | ||
# pragma freefun str | ||
# pragma linksign [ nums ] | ||
# pragma refcounting [ nums ] | ||
# pragma effect qual_ext_id [ , qual_ext_id ] | ||
withloop_pragma | # pragma wlcomp funcall | |
cachesim_pragma | # pragma cachesim [ str ] | |
function_pragma | # pragma recountdots | |
# pragma mutcthreadfun | ||
# pragma noinline |