5.16.5.1. Abstract Type

Start data section to src/flx_parse.mly[6 /33 ] Next Prev First Last
   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: 
End data section to src/flx_parse.mly[6]