summaryrefslogtreecommitdiff
path: root/parsing/parser.mly
diff options
context:
space:
mode:
authoroctachron <octa@polychoron.fr>2016-05-05 19:50:56 +0200
committerGabriel Scherer <gabriel.scherer@gmail.com>2016-05-09 09:35:05 -0400
commit96806cf63356d6577c4c3faef60ba62cd72ea158 (patch)
tree9c07e2df0244f2ed13051339252efbdf52ae2295 /parsing/parser.mly
parent6712be88f08d44ed81ffa9d0805a1372cf3447ea (diff)
downloadocaml-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.mly52
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 }