@@ -1354,6 +1354,15 @@ expr:
1354
1354
{ expr_of_let_bindings $1 $3 }
1355
1355
| LET MODULE ext_attributes UIDENT module_binding_body IN seq_expr
1356
1356
{ mkexp_attrs (Pexp_letmodule(mkrhs $4 4, $5, $7)) $3 }
1357
+ | LET EXCEPTION ext_attributes constr_ident generalized_constructor_arguments
1358
+ attributes IN seq_expr
1359
+ { let args, res = $ 5 in
1360
+ let ex =
1361
+ Te. decl (mkrhs $4 4 ) ~args ?res ~attrs :$6
1362
+ ~loc :(symbol_rloc () )
1363
+ in
1364
+ mkexp_attrs (Pexp_letexception(ex , $8 )) $ 3
1365
+ }
1357
1366
| LET OPEN override_flag ext_attributes mod_longident IN seq_expr
1358
1367
{ mkexp_attrs (Pexp_open($3, mkrhs $5 5, $7)) $4 }
1359
1368
| FUNCTION ext_attributes opt_bar match_cases
@@ -1616,7 +1625,7 @@ let_binding_body:
1616
1625
| val_ident COLON TYPE lident_list DOT core_type EQUAL seq_expr
1617
1626
{ let exp, poly = wrap_type_annotation $4 $6 $8 in
1618
1627
(ghpat(Ppat_constraint(mkpatvar $1 1, poly)), exp) }
1619
- | pattern EQUAL seq_expr
1628
+ | pattern_no_exn EQUAL seq_expr
1620
1629
{ ($1, $3) }
1621
1630
| simple_pattern_not_ident COLON core_type EQUAL seq_expr
1622
1631
{ (ghpat(Ppat_constraint($1, $3)), $5) }
@@ -1722,36 +1731,58 @@ opt_type_constraint:
1722
1731
/* Patterns */
1723
1732
1724
1733
pattern:
1725
- simple_pattern
1726
- { $1 }
1727
1734
| pattern AS val_ident
1728
1735
{ mkpat(Ppat_alias($1, mkrhs $3 3)) }
1729
1736
| pattern AS error
1730
1737
{ expecting 3 " identifier " }
1731
1738
| pattern_comma_list %prec below_COMMA
1732
1739
{ mkpat(Ppat_tuple(List.rev $1)) }
1733
- | constr_longident pattern %prec prec_constr_appl
1734
- { mkpat(Ppat_construct(mkrhs $1 1, Some $2)) }
1735
- | name_tag pattern %prec prec_constr_appl
1736
- { mkpat(Ppat_variant($1, Some $2)) }
1737
1740
| pattern COLONCOLON pattern
1738
1741
{ mkpat_cons (rhs_loc 2) (ghpat(Ppat_tuple[$1;$3])) (symbol_rloc()) }
1739
1742
| pattern COLONCOLON error
1740
1743
{ expecting 3 " pattern " }
1741
- | LPAREN COLONCOLON RPAREN LPAREN pattern COMMA pattern RPAREN
1742
- { mkpat_cons (rhs_loc 2) (ghpat(Ppat_tuple[$5;$7])) (symbol_rloc()) }
1743
- | LPAREN COLONCOLON RPAREN LPAREN pattern COMMA pattern error
1744
- { unclosed " (" 4 " )" 8 }
1745
1744
| pattern BAR pattern
1746
1745
{ mkpat(Ppat_or($1, $3)) }
1747
1746
| pattern BAR error
1748
1747
{ expecting 3 " pattern " }
1749
- | LAZY ext_attributes simple_pattern
1750
- { mkpat_attrs (Ppat_lazy $3) $2}
1751
1748
| EXCEPTION ext_attributes pattern %prec prec_constr_appl
1752
1749
{ mkpat_attrs (Ppat_exception $3) $2}
1753
1750
| pattern attribute
1754
1751
{ Pat.attr $1 $2 }
1752
+ | pattern_gen { $1 }
1753
+ ;
1754
+ pattern_no_exn:
1755
+ | pattern_no_exn AS val_ident
1756
+ { mkpat(Ppat_alias($1, mkrhs $3 3)) }
1757
+ | pattern_no_exn AS error
1758
+ { expecting 3 " identifier " }
1759
+ | pattern_no_exn_comma_list %prec below_COMMA
1760
+ { mkpat(Ppat_tuple(List.rev $1)) }
1761
+ | pattern_no_exn COLONCOLON pattern
1762
+ { mkpat_cons (rhs_loc 2) (ghpat(Ppat_tuple[$1;$3])) (symbol_rloc()) }
1763
+ | pattern_no_exn COLONCOLON error
1764
+ { expecting 3 " pattern " }
1765
+ | pattern_no_exn BAR pattern
1766
+ { mkpat(Ppat_or($1, $3)) }
1767
+ | pattern_no_exn BAR error
1768
+ { expecting 3 " pattern " }
1769
+ | pattern_no_exn attribute
1770
+ { Pat.attr $1 $2 }
1771
+ | pattern_gen { $1 }
1772
+ ;
1773
+ pattern_gen:
1774
+ simple_pattern
1775
+ { $1 }
1776
+ | constr_longident pattern %prec prec_constr_appl
1777
+ { mkpat(Ppat_construct(mkrhs $1 1, Some $2)) }
1778
+ | name_tag pattern %prec prec_constr_appl
1779
+ { mkpat(Ppat_variant($1, Some $2)) }
1780
+ | LPAREN COLONCOLON RPAREN LPAREN pattern COMMA pattern RPAREN
1781
+ { mkpat_cons (rhs_loc 2) (ghpat(Ppat_tuple[$5;$7])) (symbol_rloc()) }
1782
+ | LPAREN COLONCOLON RPAREN LPAREN pattern COMMA pattern error
1783
+ { unclosed " (" 4 " )" 8 }
1784
+ | LAZY ext_attributes simple_pattern
1785
+ { mkpat_attrs (Ppat_lazy $3) $2}
1755
1786
;
1756
1787
simple_pattern:
1757
1788
val_ident %prec below_EQUAL
@@ -1813,6 +1844,11 @@ pattern_comma_list:
1813
1844
| pattern COMMA pattern { [$3; $1] }
1814
1845
| pattern COMMA error { expecting 3 " pattern " }
1815
1846
;
1847
+ pattern_no_exn_comma_list:
1848
+ pattern_no_exn_comma_list COMMA pattern { $3 :: $1 }
1849
+ | pattern_no_exn COMMA pattern { [$3; $1] }
1850
+ | pattern_no_exn COMMA error { expecting 3 " pattern " }
1851
+ ;
1816
1852
pattern_semi_list:
1817
1853
pattern { [$1] }
1818
1854
| pattern_semi_list SEMI pattern { $3 :: $1 }
0 commit comments