summaryrefslogtreecommitdiffstats
path: root/parsing/parser.mly
diff options
context:
space:
mode:
Diffstat (limited to 'parsing/parser.mly')
-rw-r--r--parsing/parser.mly22
1 files changed, 22 insertions, 0 deletions
diff --git a/parsing/parser.mly b/parsing/parser.mly
index 885a581d4..87d43bdab 100644
--- a/parsing/parser.mly
+++ b/parsing/parser.mly
@@ -319,6 +319,17 @@ let wrap_type_annotation newtypes core_type body =
let polyvars, core_type = varify_constructors newtypes core_type in
(exp, ghtyp(Ptyp_poly(polyvars,core_type)))
+let let_operator op bindings cont =
+ let pat, expr =
+ match List.rev bindings with
+ | [] -> assert false
+ | [x] -> x
+ | l ->
+ let pats, exprs = List.split l in
+ ghpat (Ppat_tuple pats), ghexp (Pexp_tuple exprs)
+ in
+ mkexp(Pexp_apply(op, ["", expr; "", ghexp(Pexp_function("", None, [pat, cont]))]))
+
%}
/* Tokens */
@@ -386,6 +397,7 @@ let wrap_type_annotation newtypes core_type body =
%token LESS
%token LESSMINUS
%token LET
+%token <string> LETOP
%token <string> LIDENT
%token LPAREN
%token MATCH
@@ -462,6 +474,7 @@ The precedences must be listed from low to high.
%nonassoc below_SEMI
%nonassoc SEMI /* below EQUAL ({lbl=...; lbl=...}) */
%nonassoc LET /* above SEMI ( ...; let ... in ...) */
+%nonassoc LETOP
%nonassoc below_WITH
%nonassoc FUNCTION WITH /* below BAR (match ... with ...) */
%nonassoc AND /* above WITH (module rec A: SIG with ... and ...) */
@@ -982,6 +995,8 @@ expr:
{ mkexp(Pexp_apply($1, List.rev $2)) }
| LET rec_flag let_bindings IN seq_expr
{ mkexp(Pexp_let($2, List.rev $3, $5)) }
+ | let_operator let_bindings IN seq_expr
+ { let_operator $1 $2 $4 }
| LET MODULE UIDENT module_binding IN seq_expr
{ mkexp(Pexp_letmodule($3, $4, $6)) }
| LET OPEN mod_longident IN seq_expr
@@ -1704,6 +1719,7 @@ operator:
| INFIXOP2 { $1 }
| INFIXOP3 { $1 }
| INFIXOP4 { $1 }
+ | LETOP { $1 }
| BANG { "!" }
| PLUS { "+" }
| PLUSDOT { "+." }
@@ -1719,6 +1735,12 @@ operator:
| AMPERAMPER { "&&" }
| COLONEQUAL { ":=" }
;
+let_operator:
+ LETOP
+ { mkexp (Pexp_ident(Lident $1)) }
+ | mod_longident DOT LETOP
+ { mkexp (Pexp_ident(Ldot ($1, $3))) }
+;
constr_ident:
UIDENT { $1 }
/* | LBRACKET RBRACKET { "[]" } */