diff options
-rw-r--r-- | parsing/parser.mly | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/parsing/parser.mly b/parsing/parser.mly index 0164e3219..fb7d5745a 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -1281,9 +1281,9 @@ simple_pattern: { mkpat(Ppat_variant($1, None)) } | SHARP type_longident { mkpat(Ppat_type (mkrhs $2 2)) } - | LBRACE lbl_pattern_list record_pattern_end RBRACE - { mkpat(Ppat_record(List.rev $2, $3)) } - | LBRACE lbl_pattern_list opt_semi error + | LBRACE lbl_pattern_list RBRACE + { let (fields, closed) = $2 in mkpat(Ppat_record(fields, closed)) } + | LBRACE lbl_pattern_list error { unclosed "{" 1 "}" 4 } | LBRACKET pattern_semi_list opt_semi RBRACKET { reloc_pat (mktailpat (List.rev $2)) } @@ -1320,14 +1320,16 @@ pattern_semi_list: | pattern_semi_list SEMI pattern { $3 :: $1 } ; lbl_pattern_list: - label_longident EQUAL pattern { [(mkrhs $1 1, $3)] } - | label_longident { [(mkrhs $1 1, pat_of_label $1 1)] } - | lbl_pattern_list SEMI label_longident EQUAL pattern { (mkrhs $3 3, $5) :: $1 } - | lbl_pattern_list SEMI label_longident { (mkrhs $3 3, pat_of_label $3 3) :: $1 } -; -record_pattern_end: - opt_semi { Closed } - | SEMI UNDERSCORE opt_semi { Open } + lbl_pattern { [$1], Closed } + | lbl_pattern SEMI { [$1], Closed } + | lbl_pattern SEMI UNDERSCORE opt_semi { [$1], Open } + | lbl_pattern SEMI lbl_pattern_list { let (fields, closed) = $3 in $1 :: fields, closed } +; +lbl_pattern: + label_longident EQUAL pattern + { (mkrhs $1 1,$3) } + | label_longident + { (mkrhs $1 1, pat_of_label $1 1) } ; /* Primitive declarations */ |