734: opt_equal: 735: | EQUAL {()} 736: | {()} 737: 738: struct_decl: 739: | STRUCT NAME tvarlist opt_equal LBRACE struct_component_aster RBRACE 740: { 741: `AST_struct (rstoken $1 $7, snd $2, $3, $6) 742: } 743: 744: | CSTRUCT NAME tvarlist opt_equal LBRACE struct_component_aster RBRACE 745: { 746: `AST_cstruct (rstoken $1 $7, snd $2, $3, $6) 747: } 748: 749: | CCLASS NAME tvarlist opt_equal LBRACE class_component_aster RBRACE 750: { 751: `AST_cclass (rstoken $1 $7, snd $2, $3, $6) 752: } 753: 754: | CLASS NAME tvarlist opt_equal compound 755: { 756: let sr = rsrange (slift $1) (fst $5) in 757: `AST_class (sr, snd $2, $3, snd $5) 758: } 759: 760: struct_component_aster: 761: | struct_component struct_component_aster { $1 :: $2 } 762: | { [] } 763: struct_component: 764: | NAME COLON expr SEMI { (snd $1,typecode_of_expr $3) } 765: 766: 767: opt_name: 768: | NAME { snd $1 } 769: | {""} 770: 771: class_component_aster: 772: | class_component class_component_aster { $1 :: $2 } 773: | { [] } 774: class_component: 775: | VAR NAME COLON expr SEMI { `MemberVar (snd $2,typecode_of_expr $4,None) } 776: | VAL NAME COLON expr SEMI { `MemberVal (snd $2,typecode_of_expr $4,None) } 777: | FUNCTION NAME tvarlist COLON expr opt_cstring SEMI 778: { `MemberFun (snd $2,None,$3,typecode_of_expr $5,$6) } 779: | PROCEDURE NAME tvarlist COLON expr opt_cstring SEMI 780: { `MemberProc (snd $2,None,$3,typecode_of_expr $5,$6) } 781: | CTOR opt_name COLON expr opt_cstring SEMI 782: { `MemberCtor ($2,None,typecode_of_expr $4,$5) } 783: