881: opt_equal: 882: | EQUAL {()} 883: | {()} 884: 885: struct_decl: 886: | STRUCT declname opt_equal LBRACE struct_component_aster RBRACE 887: { 888: let name,vs = hd $2 in 889: let sr = rstoken $1 $6 in 890: let stmt = `AST_struct (sr,name,vs,$5) in 891: fold_left (fun stmt (name,vs) -> `AST_namespace (sr,name,vs,[stmt])) stmt (tl $2) 892: } 893: 894: | CSTRUCT declname opt_equal LBRACE struct_component_aster RBRACE 895: { 896: let name,vs = hd $2 in 897: let sr = rstoken $1 $6 in 898: let stmt = `AST_cstruct (sr,name,vs, $5) in 899: fold_left (fun stmt (name,vs) -> `AST_namespace (sr,name,vs,[stmt])) stmt (tl $2) 900: } 901: 902: | CCLASS declname opt_equal LBRACE class_component_aster RBRACE 903: { 904: let name,vs = hd $2 in 905: let sr = rstoken $1 $6 in 906: let stmt = `AST_cclass (sr, name,vs, $5) in 907: fold_left (fun stmt (name,vs) -> `AST_namespace (sr,name,vs,[stmt])) stmt (tl $2) 908: } 909: 910: | CLASS declname opt_equal compound 911: { 912: let name,vs = hd $2 in 913: let sr = rsrange (slift $1) (fst $4) in 914: let stmt = `AST_class (sr, name,vs, snd $4) in 915: fold_left (fun stmt (name,vs) -> `AST_namespace (sr,name,vs,[stmt])) stmt (tl $2) 916: } 917: 918: | TYPECLASS declname opt_equal compound 919: { 920: let name,vs = hd $2 in 921: let sr = rsrange (slift $1) (fst $4) in 922: let stmt = `AST_typeclass (sr, name, vs, snd $4) in 923: fold_left (fun stmt (name,vs) -> `AST_namespace (sr,name,vs,[stmt])) stmt (tl $2) 924: } 925: 926: | INSTANCE tvarlist qualified_name opt_equal compound 927: { 928: let sr = rsrange (slift $1) (fst $5) in 929: let vs = $2 in 930: match $3 with 931: | (`AST_name _ | `AST_lookup _) as qn -> 932: `AST_instance (sr, vs, qn, snd $5) 933: | _ -> Flx_exceptions.clierr sr "Qualified name required" 934: } 935: 936: struct_component_aster: 937: | struct_component struct_component_aster { $1 :: $2 } 938: | { [] } 939: struct_component: 940: | NAME COLON expr SEMI { (snd $1,typecode_of_expr $3) } 941: 942: 943: opt_name: 944: | NAME { snd $1 } 945: | {""} 946: 947: class_component_aster: 948: | class_component class_component_aster { $1 :: $2 } 949: | { [] } 950: class_component: 951: | VAR NAME COLON expr SEMI { `MemberVar (snd $2,typecode_of_expr $4,None) } 952: | VAL NAME COLON expr SEMI { `MemberVal (snd $2,typecode_of_expr $4,None) } 953: | CTOR opt_name COLON expr opt_cstring SEMI 954: { `MemberCtor ($2,None,typecode_of_expr $4,$5) } 955: | FUNCTION NAME tvarlist COLON expr opt_cstring SEMI 956: { `MemberFun (snd $2,None,$3,typecode_of_expr $5,$6) } 957: | PROCEDURE NAME tvarlist COLON expr opt_cstring SEMI 958: { `MemberProc (snd $2,None,$3,typecode_of_expr $5,$6) } 959: 960: typeclass_component_aster: 961: | typeclass_component typeclass_component_aster { $1 :: $2 } 962: | { [] } 963: typeclass_component: 964: | FUNCTION NAME COLON expr SEMI 965: { `TypeClassMemberFun (rstoken $1 $5, snd $2,typecode_of_expr $4) } 966: | PROCEDURE NAME COLON expr SEMI 967: { `TypeClassMemberProc (rstoken $1 $5, snd $2,typecode_of_expr $4) } 968: 969: