8 |
|
|
9 |
%tokens |
%tokens |
10 |
: KW_bool ("bool") |
: KW_bool ("bool") |
|
| KW_D ("D") (* either D or ∇ *) |
|
11 |
| KW_die ("die") |
| KW_die ("die") |
12 |
| KW_else ("else") |
| KW_else ("else") |
13 |
| KW_false ("false") |
| KW_false ("false") |
20 |
| KW_initially ("initially") |
| KW_initially ("initially") |
21 |
| KW_int ("int") |
| KW_int ("int") |
22 |
| KW_kernel ("kernel") |
| KW_kernel ("kernel") |
23 |
|
| KW_load ("load") |
24 |
| KW_new ("new") |
| KW_new ("new") |
25 |
| KW_output ("output") |
| KW_output ("output") |
26 |
| KW_print ("print") |
| KW_print ("print") |
82 |
; |
; |
83 |
|
|
84 |
%keywords |
%keywords |
85 |
KW_bool, KW_D, KW_die, KW_else, KW_field, KW_identity, KW_if, KW_image, KW_initially, |
KW_bool, KW_die, KW_else, KW_field, KW_identity, KW_if, KW_image, KW_initially, |
86 |
KW_int, KW_kernel, KW_new, KW_output, KW_print, KW_real, KW_stabilize, KW_strand, |
KW_int, KW_kernel, KW_load, KW_new, KW_output, KW_print, KW_real, KW_stabilize, |
87 |
KW_string, KW_tensor, KW_update, KW_vec2, KW_vec3, KW_vec4, KW_zeros; |
KW_strand, KW_string, KW_tensor, KW_update, KW_vec2, KW_vec3, KW_vec4, KW_zeros; |
88 |
|
|
89 |
%defs ( |
%defs ( |
90 |
structure PT = ParseTree |
structure PT = ParseTree |
132 |
); |
); |
133 |
|
|
134 |
File |
File |
135 |
: Decl+ => (PT.Program{span=FULL_SPAN, tree=Decl}) |
: GlobalDecl+ StrandDecl CoordinationDecl |
136 |
|
=> (PT.Program{span=FULL_SPAN, tree=GlobalDecl @ [StrandDecl, CoordinationDecl]}) |
137 |
; |
; |
138 |
|
|
139 |
Decl |
GlobalDecl |
140 |
: InputDecl |
: InputDecl |
141 |
| VarDecl => (mark PT.D_Mark (FULL_SPAN, PT.D_Var VarDecl)) |
| VarDecl |
142 |
| StrandDecl |
=> (mark PT.D_Mark (FULL_SPAN, PT.D_Var VarDecl)) |
|
| CoordinationDecl |
|
143 |
; |
; |
144 |
|
|
|
|
|
145 |
(***** Inputs *****) |
(***** Inputs *****) |
146 |
|
|
147 |
InputDecl |
InputDecl |
148 |
: "input" ValueType ID ("(" STRING ")")? ( "=" Initializer )? ";" |
: "input" InputType ID ("(" STRING ")")? ( "=" Initializer )? ";" |
149 |
=> (markDecl(FULL_SPAN, PT.D_Input(ValueType, ID, Option.getOpt(SR1, ""), SR2))) |
=> (markDecl(FULL_SPAN, PT.D_Input(InputType, ID, Option.getOpt(SR1, ""), SR2))) |
150 |
; |
; |
151 |
|
|
152 |
(***** variable declarations *****) |
(***** variable declarations *****) |
298 |
=> (fn ty => SeqDimensions(PT.T_Seq(ty, Dimension))) |
=> (fn ty => SeqDimensions(PT.T_Seq(ty, Dimension))) |
299 |
; |
; |
300 |
|
|
301 |
|
InputType |
302 |
|
: "image" "(" Dimension ")" Dimensions |
303 |
|
=> (markTy(FULL_SPAN, PT.T_Image{ |
304 |
|
shape = Dimensions, dim = Dimension |
305 |
|
})) |
306 |
|
| ValueType SeqDimensions |
307 |
|
=> (markTy(FULL_SPAN, SeqDimensions ValueType)) |
308 |
|
; |
309 |
|
|
310 |
ValueType |
ValueType |
311 |
: "tensor" Dimensions |
: "tensor" Dimensions |
312 |
=> (markTy(FULL_SPAN, PT.T_Tensor Dimensions)) |
=> (markTy(FULL_SPAN, PT.T_Tensor Dimensions)) |
398 |
=> (markExpr(FULL_SPAN, PT.E_UnaryOp(B.op_neg, PrefixExpr))) |
=> (markExpr(FULL_SPAN, PT.E_UnaryOp(B.op_neg, PrefixExpr))) |
399 |
| "!" PrefixExpr |
| "!" PrefixExpr |
400 |
=> (markExpr(FULL_SPAN, PT.E_UnaryOp(B.op_not, PrefixExpr))) |
=> (markExpr(FULL_SPAN, PT.E_UnaryOp(B.op_not, PrefixExpr))) |
|
| "D" PrefixExpr |
|
|
=> (markExpr(FULL_SPAN, PT.E_Apply(PT.E_Var B.fn_D, [PrefixExpr]))) |
|
401 |
; |
; |
402 |
|
|
403 |
SuffixExpr |
SuffixExpr |
449 |
=> (markExpr(FULL_SPAN, PT.E_Id Dimension)) |
=> (markExpr(FULL_SPAN, PT.E_Id Dimension)) |
450 |
| KW_zeros Dimensions |
| KW_zeros Dimensions |
451 |
=> (markExpr(FULL_SPAN, PT.E_Zero Dimensions)) |
=> (markExpr(FULL_SPAN, PT.E_Zero Dimensions)) |
452 |
|
(* should the following be classified as SuffixExprs? *) |
453 |
| "real" "(" Expr ")" |
| "real" "(" Expr ")" |
454 |
=> (markExpr(FULL_SPAN, PT.E_Real Expr)) |
=> (markExpr(FULL_SPAN, PT.E_Real Expr)) |
455 |
|
| LoadExpr |
456 |
|
=> (LoadExpr) |
457 |
| "(" Expr ("," Expr)* ")" |
| "(" Expr ("," Expr)* ")" |
458 |
=> (case SR |
=> (case SR |
459 |
of [] => Expr |
of [] => Expr |
484 |
=> (markExpr(FULL_SPAN, PT.E_Id Dimension)) |
=> (markExpr(FULL_SPAN, PT.E_Id Dimension)) |
485 |
| KW_zeros Dimensions |
| KW_zeros Dimensions |
486 |
=> (markExpr(FULL_SPAN, PT.E_Zero Dimensions)) |
=> (markExpr(FULL_SPAN, PT.E_Zero Dimensions)) |
487 |
|
| LoadExpr |
488 |
|
=> (LoadExpr) |
489 |
| "{" Initializer ("," Initializer)* "}" |
| "{" Initializer ("," Initializer)* "}" |
490 |
=> (markExpr(FULL_SPAN, PT.E_Sequence(Initializer::SR))) |
=> (markExpr(FULL_SPAN, PT.E_Sequence(Initializer::SR))) |
491 |
| "[" Initializer ("," Initializer)* "]" |
| "[" Initializer ("," Initializer)* "]" |
505 |
| "false" |
| "false" |
506 |
=> (markExpr(FULL_SPAN, PT.E_Lit(L.Bool false))) |
=> (markExpr(FULL_SPAN, PT.E_Lit(L.Bool false))) |
507 |
; |
; |
508 |
|
|
509 |
|
LoadExpr |
510 |
|
: KW_image "(" STRING ")" |
511 |
|
=> (markExpr(FULL_SPAN, |
512 |
|
PT.E_Apply(PT.E_Var B.fn_image, [PT.E_Lit(L.String STRING)]))) |
513 |
|
| KW_load "(" STRING ")" |
514 |
|
=> (markExpr(FULL_SPAN, |
515 |
|
PT.E_Apply(PT.E_Var B.fn_load, [PT.E_Lit(L.String STRING)]))) |
516 |
|
; |