897: type_alias: 898: | TYPEDEF NAME tvarlist EQUAL expr SEMI 899: { 900: let sr = rstoken $1 $6 901: and name = snd $2 902: and return_type = `TYP_type 903: and body = typecode_of_expr $5 904: and vs = $3 905: in 906: `AST_type_alias (sr,name,vs,body) 907: } 908: 909: | TYPEDEF FUNCTION NAME tvarlist fun_args COLON expr EQRIGHTARROW expr SEMI 910: { 911: let sr = rstoken $1 $10 912: and name = snd $3 913: and return_type = typecode_of_expr $7 914: and body = typecode_of_expr $9 915: and args = List.map snd $5 (* elide srcref *) 916: and vs = $4 917: in 918: mktypefun sr name vs args return_type body 919: } 920: 921: | TYPEDEF FUNCTION NAME tvarlist COLON expr EQUAL type_matchings SEMI 922: { 923: let sr = rstoken $1 $9 in 924: let name = snd $3 in 925: let vs = $4 in 926: let t = typecode_of_expr $6 in 927: match t with 928: | `TYP_function (argt, return_type) -> 929: let args = [["_a",argt],None] in 930: let match_expr = `AST_type_match (sr,(`AST_name (sr,"_a",[]),$8)) in 931: let body = typecode_of_expr match_expr in 932: mktypefun sr name vs args return_type body 933: | _ -> 934: failwith 935: ( 936: "Function '"^name^"' requires function type, got " ^ 937: string_of_typecode t ^ " in " ^ 938: short_string_of_src sr 939: ) 940: } 941: 942: 943: | RENAME NAME tvarlist EQUAL qualified_name SEMI 944: { 945: let sr = rstoken $1 $6 946: and name = snd $2 947: and vs = $3 948: and qn = qualified_name_of_expr $5 949: in 950: `AST_inherit (sr,name,vs,qn) 951: } 952: 953: | RENAME FUNCTION NAME tvarlist EQUAL qualified_name SEMI 954: { 955: let sr = rstoken $1 $7 956: and name = snd $3 957: and vs = $4 958: and qn = qualified_name_of_expr $6 959: in 960: `AST_inherit_fun (sr,name,vs,qn) 961: } 962: 963: | INHERIT qualified_name SEMI 964: { 965: let sr = rstoken $1 $3 966: and qn = qualified_name_of_expr $2 967: in 968: `AST_inject_module (sr,qn) 969: } 970: