602: tvar: 603: | NAME { snd $1 , `TPAT_any } 604: | NAME COLON tpattern { snd $1 , $3 } 605: 606: tvar_comma_list: 607: | tvar COMMA tvar_comma_list { $1 :: $3 } 608: | tvar { [$1] } 609: | { [] } 610: 611: tvarlist: 612: | LSQB tvar_comma_list RSQB { $2 } 613: | { [] } 614: 615: type_qual: 616: | INCOMPLETE { [$1,`Incomplete] } 617: | POD { [$1, `Pod] } /* POD types don't require destructors */ 618: | GC_POINTER { [$1, `GC_pointer] } 619: | GC_TYPE expr 620: { 621: let t = $2 in 622: let t = typecode_of_expr t in 623: [$1, `Raw_needs_shape t ] 624: } 625: 626: type_quals: 627: | type_qual type_quals { $1 @ $2 } 628: | { [] } 629: 630: abstract_type: 631: | type_quals CTYPES basic_name_comma_list requires_clause SEMI 632: { 633: let sr = rstoken $2 $5 in 634: let qs = List.map snd $1 in 635: `AST_ctypes (sr,$3,qs,$4) 636: } 637: 638: | type_quals TYPE NAME tvarlist EQUAL code_spec requires_clause SEMI 639: { 640: let qs = List.map snd $1 in 641: `AST_abs_decl (rstoken $2 $8, snd $3, $4, qs, $6, $7) 642: } 643: 644: | CALLBACK PROCEDURE NAME COLON expr requires_clause SEMI 645: { 646: let sr = rstoken $1 $7 in 647: let name = snd $3 in 648: let t = typecode_of_expr $5 in 649: let rqs = $6 in 650: let args = 651: match t with 652: | `TYP_tuple lst -> lst 653: | x -> [x] 654: in 655: `AST_callback_decl (sr,name,args,`AST_void sr,rqs) 656: } 657: 658: | CALLBACK FUNCTION NAME COLON expr requires_clause SEMI 659: { 660: let sr = rstoken $1 $7 in 661: let name = snd $3 in 662: let t = typecode_of_expr $5 in 663: let rqs = $6 in 664: match t with 665: | `TYP_function (arg, ret) -> 666: let args = 667: match arg with 668: | `TYP_tuple lst -> lst 669: | x -> [x] 670: in 671: `AST_callback_decl (sr,name,args,ret,rqs) 672: | _ -> 673: failwith 674: ( 675: "Function '"^name^"' requires function type, got " ^ 676: string_of_typecode t ^ " in " ^ 677: short_string_of_src sr 678: ) 679: } 680: 681: