@@ -98,6 +98,12 @@ let mkuminus name arg =
98
98
| _ ->
99
99
mkexp(Pexp_apply (mkoperator (" ~" ^ name) 1 , [" " , arg]))
100
100
101
+ let mkuplus name arg =
102
+ match name, arg.pexp_desc with
103
+ | "+" , desc -> mkexp desc
104
+ | _ ->
105
+ mkexp(Pexp_apply (mkoperator (" ~" ^ name) 1 , [" " , arg]))
106
+
101
107
let rec mktailexp = function
102
108
[] ->
103
109
ghexp(Pexp_construct (Lident " []" , None , false ))
@@ -281,6 +287,7 @@ let pat_of_label lbl =
281
287
% token OR
282
288
/* % token PARSER */
283
289
% token PLUS
290
+ % token PLUSDOT
284
291
% token < string > PREFIXOP
285
292
% token PRIVATE
286
293
% token QUESTION
@@ -356,10 +363,10 @@ The precedences must be listed from low to high.
356
363
%left INFIXOP0 EQUAL LESS GREATER /* expr (e OP e OP e ) */
357
364
%right INFIXOP1 /* expr (e OP e OP e ) */
358
365
%right COLONCOLON /* expr (e :: e :: e ) */
359
- %left INFIXOP2 PLUS MINUS MINUSDOT /* expr (e OP e OP e ) */
366
+ %left INFIXOP2 PLUS PLUSDOT MINUS MINUSDOT /* expr (e OP e OP e ) */
360
367
%left INFIXOP3 STAR /* expr (e OP e OP e ) */
361
368
%right INFIXOP4 /* expr (e OP e OP e ) */
362
- %nonassoc prec_unary_minus /* unary - */
369
+ %nonassoc prec_unary_minus prec_unary_plus /* unary - */
363
370
%nonassoc prec_constant_constructor /* cf . simple_expr (C versus C x ) */
364
371
%nonassoc prec_constr_appl /* above AS BAR COLONCOLON COMMA */
365
372
%nonassoc below_SHARP
@@ -877,6 +884,8 @@ expr:
877
884
{ mkinfix $1 $2 $3 }
878
885
| expr PLUS expr
879
886
{ mkinfix $1 "+" $3 }
887
+ | expr PLUSDOT expr
888
+ { mkinfix $1 "+." $3 }
880
889
| expr MINUS expr
881
890
{ mkinfix $1 "-" $3 }
882
891
| expr MINUSDOT expr
@@ -901,6 +910,8 @@ expr:
901
910
{ mkinfix $1 ":=" $3 }
902
911
| subtractive expr %prec prec_unary_minus
903
912
{ mkuminus $1 $2 }
913
+ | additive expr %prec prec_unary_plus
914
+ { mkuplus $1 $2 }
904
915
| simple_expr DOT label_longident LESSMINUS expr
905
916
{ mkexp(Pexp_setfield($1, $3, $5)) }
906
917
| simple_expr DOT LPAREN seq_expr RPAREN LESSMINUS expr
@@ -1481,6 +1492,7 @@ operator:
1481
1492
| INFIXOP3 { $1 }
1482
1493
| INFIXOP4 { $1 }
1483
1494
| PLUS { " +" }
1495
+ | PLUSDOT { " +." }
1484
1496
| MINUS { " -" }
1485
1497
| MINUSDOT { " -." }
1486
1498
| STAR { " *" }
@@ -1592,4 +1604,8 @@ subtractive:
1592
1604
| MINUS { " - " }
1593
1605
| MINUSDOT { " -. " }
1594
1606
;
1607
+ additive:
1608
+ | PLUS { " + " }
1609
+ | PLUSDOT { " +. " }
1610
+ ;
1595
1611
%%
0 commit comments