5.16.7.3. Struct Binding

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