Skip to content

Commit 6664b06

Browse files
nojbdamiendoligez
authored andcommitted
Parser: allow seq_expr inside extended indexing/bigarray operators (ocaml#1467)
1 parent 43d77ff commit 6664b06

4 files changed

Lines changed: 93 additions & 20 deletions

File tree

Changes

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ be mentioned in the 4.06 section below instead of here.)
88

99
### Language features:
1010

11+
- GPR#1467: Allow expressions sequences inside extended indexing and bigarray
12+
indexing operators, e.g.: e1.![e2; e3; ...], etc.
13+
(Nicolas Ojeda Bar, review by Gabriel Radanne, Damien Doligez, Gabriel
14+
Scherer)
15+
1116
### Type system:
1217

1318
- GPR#1370: Fix code duplication in Cmmgen

parsing/parser.mly

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1410,24 +1410,24 @@ expr:
14101410
| simple_expr DOT LBRACKET seq_expr RBRACKET LESSMINUS expr
14111411
{ mkexp(Pexp_apply(ghexp(Pexp_ident(array_function "String" "set")),
14121412
[Nolabel,$1; Nolabel,$4; Nolabel,$7])) }
1413-
| simple_expr DOT LBRACE expr RBRACE LESSMINUS expr
1413+
| simple_expr DOT LBRACE seq_expr RBRACE LESSMINUS expr
14141414
{ bigarray_set $1 $4 $7 }
1415-
| simple_expr DOTOP LBRACKET expr RBRACKET LESSMINUS expr
1415+
| simple_expr DOTOP LBRACKET seq_expr RBRACKET LESSMINUS expr
14161416
{ let id = mkexp @@ Pexp_ident( ghloc @@ Lident ("." ^ $2 ^ "[]<-")) in
14171417
mkexp @@ Pexp_apply(id , [Nolabel, $1; Nolabel, $4; Nolabel, $7]) }
1418-
| simple_expr DOTOP LPAREN expr RPAREN LESSMINUS expr
1418+
| simple_expr DOTOP LPAREN seq_expr RPAREN LESSMINUS expr
14191419
{ let id = mkexp @@ Pexp_ident( ghloc @@ Lident ("." ^ $2 ^ "()<-")) in
14201420
mkexp @@ Pexp_apply(id , [Nolabel, $1; Nolabel, $4; Nolabel, $7]) }
1421-
| simple_expr DOTOP LBRACE expr RBRACE LESSMINUS expr
1421+
| simple_expr DOTOP LBRACE seq_expr RBRACE LESSMINUS expr
14221422
{ let id = mkexp @@ Pexp_ident( ghloc @@ Lident ("." ^ $2 ^ "{}<-")) in
14231423
mkexp @@ Pexp_apply(id , [Nolabel, $1; Nolabel, $4; Nolabel, $7]) }
1424-
| simple_expr DOT mod_longident DOTOP LBRACKET expr RBRACKET LESSMINUS expr
1424+
| simple_expr DOT mod_longident DOTOP LBRACKET seq_expr RBRACKET LESSMINUS expr
14251425
{ let id = mkexp @@ Pexp_ident( ghloc @@ Ldot($3,"." ^ $4 ^ "[]<-")) in
14261426
mkexp @@ Pexp_apply(id , [Nolabel, $1; Nolabel, $6; Nolabel, $9]) }
1427-
| simple_expr DOT mod_longident DOTOP LPAREN expr RPAREN LESSMINUS expr
1427+
| simple_expr DOT mod_longident DOTOP LPAREN seq_expr RPAREN LESSMINUS expr
14281428
{ let id = mkexp @@ Pexp_ident( ghloc @@ Ldot($3, "." ^ $4 ^ "()<-")) in
14291429
mkexp @@ Pexp_apply(id , [Nolabel, $1; Nolabel, $6; Nolabel, $9]) }
1430-
| simple_expr DOT mod_longident DOTOP LBRACE expr RBRACE LESSMINUS expr
1430+
| simple_expr DOT mod_longident DOTOP LBRACE seq_expr RBRACE LESSMINUS expr
14311431
{ let id = mkexp @@ Pexp_ident( ghloc @@ Ldot($3, "." ^ $4 ^ "{}<-")) in
14321432
mkexp @@ Pexp_apply(id , [Nolabel, $1; Nolabel, $6; Nolabel, $9]) }
14331433
| label LESSMINUS expr
@@ -1486,37 +1486,37 @@ simple_expr:
14861486
[Nolabel,$1; Nolabel,$4])) }
14871487
| simple_expr DOT LBRACKET seq_expr error
14881488
{ unclosed "[" 3 "]" 5 }
1489-
| simple_expr DOTOP LBRACKET expr RBRACKET
1489+
| simple_expr DOTOP LBRACKET seq_expr RBRACKET
14901490
{ let id = mkexp @@ Pexp_ident( ghloc @@ Lident ("." ^ $2 ^ "[]")) in
14911491
mkexp @@ Pexp_apply(id, [Nolabel, $1; Nolabel, $4]) }
1492-
| simple_expr DOTOP LBRACKET expr error
1492+
| simple_expr DOTOP LBRACKET seq_expr error
14931493
{ unclosed "[" 3 "]" 5 }
1494-
| simple_expr DOTOP LPAREN expr RPAREN
1494+
| simple_expr DOTOP LPAREN seq_expr RPAREN
14951495
{ let id = mkexp @@ Pexp_ident( ghloc @@ Lident ("." ^ $2 ^ "()")) in
14961496
mkexp @@ Pexp_apply(id, [Nolabel, $1; Nolabel, $4]) }
1497-
| simple_expr DOTOP LPAREN expr error
1497+
| simple_expr DOTOP LPAREN seq_expr error
14981498
{ unclosed "(" 3 ")" 5 }
1499-
| simple_expr DOTOP LBRACE expr RBRACE
1499+
| simple_expr DOTOP LBRACE seq_expr RBRACE
15001500
{ let id = mkexp @@ Pexp_ident( ghloc @@ Lident ("." ^ $2 ^ "{}")) in
15011501
mkexp @@ Pexp_apply(id, [Nolabel, $1; Nolabel, $4]) }
1502-
| simple_expr DOTOP LBRACE expr error
1502+
| simple_expr DOTOP LBRACE seq_expr error
15031503
{ unclosed "{" 3 "}" 5 }
1504-
| simple_expr DOT mod_longident DOTOP LBRACKET expr RBRACKET
1504+
| simple_expr DOT mod_longident DOTOP LBRACKET seq_expr RBRACKET
15051505
{ let id = mkexp @@ Pexp_ident( ghloc @@ Ldot($3, "." ^ $4 ^ "[]")) in
15061506
mkexp @@ Pexp_apply(id, [Nolabel, $1; Nolabel, $6]) }
1507-
| simple_expr DOT mod_longident DOTOP LBRACKET expr error
1507+
| simple_expr DOT mod_longident DOTOP LBRACKET seq_expr error
15081508
{ unclosed "[" 5 "]" 7 }
1509-
| simple_expr DOT mod_longident DOTOP LPAREN expr RPAREN
1509+
| simple_expr DOT mod_longident DOTOP LPAREN seq_expr RPAREN
15101510
{ let id = mkexp @@ Pexp_ident( ghloc @@ Ldot($3, "." ^ $4 ^ "()")) in
15111511
mkexp @@ Pexp_apply(id, [Nolabel, $1; Nolabel, $6]) }
1512-
| simple_expr DOT mod_longident DOTOP LPAREN expr error
1512+
| simple_expr DOT mod_longident DOTOP LPAREN seq_expr error
15131513
{ unclosed "(" 5 ")" 7 }
1514-
| simple_expr DOT mod_longident DOTOP LBRACE expr RBRACE
1514+
| simple_expr DOT mod_longident DOTOP LBRACE seq_expr RBRACE
15151515
{ let id = mkexp @@ Pexp_ident( ghloc @@ Ldot($3, "." ^ $4 ^ "{}")) in
15161516
mkexp @@ Pexp_apply(id, [Nolabel, $1; Nolabel, $6]) }
1517-
| simple_expr DOT mod_longident DOTOP LBRACE expr error
1517+
| simple_expr DOT mod_longident DOTOP LBRACE seq_expr error
15181518
{ unclosed "{" 5 "}" 7 }
1519-
| simple_expr DOT LBRACE expr RBRACE
1519+
| simple_expr DOT LBRACE seq_expr RBRACE
15201520
{ bigarray_get $1 $4 }
15211521
| simple_expr DOT LBRACE expr_comma_list error
15221522
{ unclosed "{" 3 "}" 5 }

testsuite/tests/parsing/extended_indexoperators.ml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,7 @@ let ( .%() ) x y = x.(y);;
2121
let x = [| 0 |];;
2222
let _ = 1 #? x.(0);;
2323
let _ = 1 #? x.%(0);;
24+
25+
(* form GPR#1467 *)
26+
let _ = x.%((); (); 0)
27+
let _ = x.%(print_endline "hello"; 0)

testsuite/tests/parsing/extended_indexoperators.ml.reference

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,5 +323,69 @@
323323
]
324324
]
325325
]
326+
structure_item (extended_indexoperators.ml[26,479+0]..[26,479+22])
327+
Pstr_value Nonrec
328+
[
329+
<def>
330+
pattern (extended_indexoperators.ml[26,479+4]..[26,479+5])
331+
Ppat_any
332+
expression (extended_indexoperators.ml[26,479+8]..[26,479+22])
333+
Pexp_apply
334+
expression (extended_indexoperators.ml[26,479+8]..[26,479+22])
335+
Pexp_ident ".%()" (extended_indexoperators.ml[26,479+8]..[26,479+22]) ghost
336+
[
337+
<arg>
338+
Nolabel
339+
expression (extended_indexoperators.ml[26,479+8]..[26,479+9])
340+
Pexp_ident "x" (extended_indexoperators.ml[26,479+8]..[26,479+9])
341+
<arg>
342+
Nolabel
343+
expression (extended_indexoperators.ml[26,479+12]..[26,479+21])
344+
Pexp_sequence
345+
expression (extended_indexoperators.ml[26,479+12]..[26,479+14])
346+
Pexp_construct "()" (extended_indexoperators.ml[26,479+12]..[26,479+14])
347+
None
348+
expression (extended_indexoperators.ml[26,479+16]..[26,479+21])
349+
Pexp_sequence
350+
expression (extended_indexoperators.ml[26,479+16]..[26,479+18])
351+
Pexp_construct "()" (extended_indexoperators.ml[26,479+16]..[26,479+18])
352+
None
353+
expression (extended_indexoperators.ml[26,479+20]..[26,479+21])
354+
Pexp_constant PConst_int (0,None)
355+
]
356+
]
357+
structure_item (extended_indexoperators.ml[27,502+0]..[27,502+37])
358+
Pstr_value Nonrec
359+
[
360+
<def>
361+
pattern (extended_indexoperators.ml[27,502+4]..[27,502+5])
362+
Ppat_any
363+
expression (extended_indexoperators.ml[27,502+8]..[27,502+37])
364+
Pexp_apply
365+
expression (extended_indexoperators.ml[27,502+8]..[27,502+37])
366+
Pexp_ident ".%()" (extended_indexoperators.ml[27,502+8]..[27,502+37]) ghost
367+
[
368+
<arg>
369+
Nolabel
370+
expression (extended_indexoperators.ml[27,502+8]..[27,502+9])
371+
Pexp_ident "x" (extended_indexoperators.ml[27,502+8]..[27,502+9])
372+
<arg>
373+
Nolabel
374+
expression (extended_indexoperators.ml[27,502+12]..[27,502+36])
375+
Pexp_sequence
376+
expression (extended_indexoperators.ml[27,502+12]..[27,502+33])
377+
Pexp_apply
378+
expression (extended_indexoperators.ml[27,502+12]..[27,502+25])
379+
Pexp_ident "print_endline" (extended_indexoperators.ml[27,502+12]..[27,502+25])
380+
[
381+
<arg>
382+
Nolabel
383+
expression (extended_indexoperators.ml[27,502+26]..[27,502+33])
384+
Pexp_constant PConst_string("hello",None)
385+
]
386+
expression (extended_indexoperators.ml[27,502+35]..[27,502+36])
387+
Pexp_constant PConst_int (0,None)
388+
]
389+
]
326390
]
327391

0 commit comments

Comments
 (0)