2497: tpattern_comma_list: 2498: | tpattern COMMA tpattern_comma_list { $1 :: $3 } 2499: | tpattern { [$1] } 2500: | { [] } 2501: 2502: tuple_tpattern: 2503: | tpattern_comma_list { 2504: match $1 with 2505: | _ :: _ :: _ -> `TPAT_type_tuple $1 2506: | x :: [] -> x 2507: | [] -> assert false 2508: } 2509: 2510: tpattern: 2511: | tpattern AS NAME { `TPAT_as ($1,snd $3) } 2512: | tpat0 { $1 } 2513: 2514: tpat0: 2515: | tpat1 RIGHTARROW tpat0 { `TPAT_function ($1,$3) } 2516: | tpat1 { $1 } 2517: 2518: tpat1: 2519: | sumpat 2520: { 2521: match $1 with 2522: | [x] -> x 2523: | ps -> `TPAT_sum ps 2524: } 2525: 2526: sumpat: 2527: | tpat2 PLUS sumpat { $1 :: $3 } 2528: | tpat2 { [$1] } 2529: 2530: tpat2: 2531: | mulpat 2532: { 2533: match $1 with 2534: | [x] -> x 2535: | ps -> `TPAT_tuple ps 2536: } 2537: 2538: mulpat: 2539: | tpat3 STAR mulpat { $1 :: $3 } 2540: | tpat3 { [$1] } 2541: 2542: tpat3: 2543: | NAME tpatlist { `TPAT_name (snd $1, $2) } 2544: | LPAR tuple_tpattern RPAR { $2 } 2545: | QUEST NAME { `TPAT_var (snd $2) } 2546: | QUEST { `TPAT_any } 2547: | UNDERSCORE { `TPAT_any } 2548: | INTEGER { let sr,t,v = $1 in `TPAT_unitsum (Big_int.int_of_big_int v) } 2549: 2550: tpatlist: 2551: | LSQB tpattern_comma_list RSQB { $2 } 2552: | { [] } 2553: 2554: 2555: type_match_expr: 2556: | TYPEMATCH expr WITH type_matchings ENDMATCH 2557: { 2558: let t = typecode_of_expr $2 in 2559: `AST_type_match (rstoken $1 $5, (t, $4)) 2560: } 2561: 2562: type_matchings: 2563: | type_matching type_matchings { $1 :: $2 } 2564: | type_matching { [$1] } 2565: 2566: type_matching: 2567: /* 2568: | VBAR tuple_tpattern EQRIGHTARROW expr { $2, typecode_of_expr $4 } 2569: */ 2570: | VBAR expr EQRIGHTARROW expr { typecode_of_expr $2, typecode_of_expr $4 } 2571: