diff options
author | octachron <octa@polychoron.fr> | 2016-05-05 19:50:56 +0200 |
---|---|---|
committer | Gabriel Scherer <gabriel.scherer@gmail.com> | 2016-05-09 09:35:05 -0400 |
commit | 96806cf63356d6577c4c3faef60ba62cd72ea158 (patch) | |
tree | 9c07e2df0244f2ed13051339252efbdf52ae2295 /parsing/parser.mly | |
parent | 6712be88f08d44ed81ffa9d0805a1372cf3447ea (diff) | |
download | ocaml-96806cf63356d6577c4c3faef60ba62cd72ea158.tar.gz |
GPR#187: local open for patterns
This commits extends the pattern syntax to support local open in
patterns. Four new constructions mirroring the expression constructions
are added
* `M.(pattern)`
* `M.[pattern_list]` ⟺ M.([pattern_list])
* `M.{labeled_pattern_list}` ⟺ M.({label_pattern_list})
* `M.[| .. |] ⟺ M.( [| .. |] )
At the typing phase, the construction `M.(pattern)` brings all
identifiers defined within M inside the scope and then proceed with the
typing of `pattern`. All others constructions are desugared to the
`M.(..)` construction during parsing.
Questionable implementation details:
* Currently, the local pattern open use the `type_open` function like
the local expression pattern. However, this implies that values defined
inside `M` are also brought to the scope. A specialized
`type_open_for_pattern` would be more efficient.
Diffstat (limited to 'parsing/parser.mly')
-rw-r--r-- | parsing/parser.mly | 52 |
1 files changed, 38 insertions, 14 deletions
diff --git a/parsing/parser.mly b/parsing/parser.mly index 7acb0d644a..2cc6042544 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -1751,6 +1751,12 @@ pattern: { expecting 3 "pattern" } | EXCEPTION ext_attributes pattern %prec prec_constr_appl { mkpat_attrs (Ppat_exception $3) $2} + | mod_longident DOT LPAREN pattern RPAREN + { mkpat @@ Ppat_open (mkrhs $1 1, $4)} + | mod_longident DOT LPAREN pattern error + {unclosed "(" 3 ")" 5 } + | mod_longident DOT LPAREN error + { expecting 4 "pattern" } | pattern attribute { Pat.attr $1 $2 } | pattern_gen { $1 } @@ -1806,20 +1812,19 @@ simple_pattern_not_ident: { mkpat(Ppat_variant($1, None)) } | SHARP type_longident { mkpat(Ppat_type (mkrhs $2 2)) } - | LBRACE lbl_pattern_list RBRACE - { let (fields, closed) = $2 in mkpat(Ppat_record(fields, closed)) } - | LBRACE lbl_pattern_list error - { unclosed "{" 1 "}" 3 } - | LBRACKET pattern_semi_list opt_semi RBRACKET - { reloc_pat (mktailpat (rhs_loc 4) (List.rev $2)) } - | LBRACKET pattern_semi_list opt_semi error - { unclosed "[" 1 "]" 4 } - | LBRACKETBAR pattern_semi_list opt_semi BARRBRACKET - { mkpat(Ppat_array(List.rev $2)) } - | LBRACKETBAR BARRBRACKET - { mkpat(Ppat_array []) } - | LBRACKETBAR pattern_semi_list opt_semi error - { unclosed "[|" 1 "|]" 4 } + | simple_delimited_pattern + { $1 } + | mod_longident DOT simple_delimited_pattern + { mkpat @@ Ppat_open(mkrhs $1 1, $3) } + | mod_longident DOT LPAREN RPAREN + { mkpat @@ Ppat_open( mkrhs $1 1, mkpat @@ + Ppat_construct ( mkrhs (Lident "()") 4, None) ) } + | mod_longident DOT LPAREN pattern RPAREN + { mkpat @@ Ppat_open (mkrhs $1 1, $4)} + | mod_longident DOT LPAREN pattern error + {unclosed "(" 3 ")" 5 } + | mod_longident DOT LPAREN error + { expecting 4 "pattern" } | LPAREN pattern RPAREN { reloc_pat $2 } | LPAREN pattern error @@ -1842,6 +1847,25 @@ simple_pattern_not_ident: | extension { mkpat(Ppat_extension $1) } ; +simple_delimited_pattern: + | LBRACE lbl_pattern_list RBRACE + { let (fields, closed) = $2 in mkpat(Ppat_record(fields, closed)) } + | LBRACE lbl_pattern_list error + { unclosed "{" 1 "}" 3 } + | LBRACE lbl_pattern_list error + { unclosed "{" 1 "}" 3 } + | LBRACKET pattern_semi_list opt_semi RBRACKET + { reloc_pat (mktailpat (rhs_loc 4) (List.rev $2)) } + | LBRACKET RBRACKET + { mkpat @@ Ppat_construct ( mkrhs (Lident "[]") 1, None) } + | LBRACKET pattern_semi_list opt_semi error + { unclosed "[" 1 "]" 4 } + | LBRACKETBAR pattern_semi_list opt_semi BARRBRACKET + { mkpat(Ppat_array(List.rev $2)) } + | LBRACKETBAR BARRBRACKET + { mkpat(Ppat_array []) } + | LBRACKETBAR pattern_semi_list opt_semi error + { unclosed "[|" 1 "|]" 4 } pattern_comma_list: pattern_comma_list COMMA pattern { $3 :: $1 } |