820: union_decl: 821: | ENUM NAME LBRACE enum_items RBRACE SEMI 822: { 823: `AST_union (rstoken $1 $6, snd $2, dfltvs, $4) 824: } 825: 826: | UNION declname EQUAL type_sum_items SEMI 827: { 828: let name,vs = hd $2 in 829: let sr = rstoken $1 $5 in 830: let stmt = `AST_union (sr, name,vs, $4) in 831: fold_left (fun stmt (name,vs) -> `AST_namespace (sr,name,vs,[stmt])) stmt (tl $2) 832: } 833: | UNION declname EQUAL VBAR type_sum_items SEMI 834: { 835: let name,vs = hd $2 in 836: let sr = rstoken $1 $6 in 837: let stmt = `AST_union (sr, name,vs, $5) in 838: fold_left (fun stmt (name,vs) -> `AST_namespace (sr,name,vs,[stmt])) stmt (tl $2) 839: } 840: 841: | UNION declname LBRACE type_sum_items2 RBRACE 842: { 843: let name,vs = hd $2 in 844: let sr = rstoken $1 $5 in 845: let stmt = `AST_union (sr, name,vs, $4) in 846: fold_left (fun stmt (name,vs) -> `AST_namespace (sr,name,vs,[stmt])) stmt (tl $2) 847: } 848: 849: opt_value: 850: | EQUAL INTEGER { 851: let sr,t,v = $2 in 852: let n = Big_int.int_of_big_int v in 853: Some n 854: } 855: | { None } 856: 857: enum_items: 858: | enum_items COMMA enum_item { $1 @ [$3] } 859: | enum_item { [$1] } 860: enum_item: 861: | NAME opt_value 862: { 863: let sr = slift (fst $1) in 864: snd $1, $2, dfltvs, typecode_of_expr (`AST_void sr) 865: } 866: 867: type_sum_items: 868: | type_sum_items VBAR type_sum_item { $1 @ [$3] } 869: | type_sum_item { [$1] } 870: type_sum_item: 871: | NAME tvarlist OF expr { (snd $1,None,$2,typecode_of_expr $4) } 872: | NAME tvarlist 873: { 874: let sr = slift (fst $1) in 875: snd $1, None, $2, typecode_of_expr (`AST_void sr) 876: } 877: type_sum_items2: 878: | type_sum_items2 type_sum_item SEMI { $1 @ [$2] } 879: | type_sum_item SEMI { [$1] } 880: