Skip to content

Commit 4753a2e

Browse files
committed
New ast to represent index access
1 parent 2ff169c commit 4753a2e

13 files changed

Lines changed: 93 additions & 0 deletions

compiler/ml/ast_helper.ml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ module Exp = struct
174174
let record ?loc ?attrs a b = mk ?loc ?attrs (Pexp_record (a, b))
175175
let field ?loc ?attrs a b = mk ?loc ?attrs (Pexp_field (a, b))
176176
let setfield ?loc ?attrs a b c = mk ?loc ?attrs (Pexp_setfield (a, b, c))
177+
let index ?loc ?attrs a b c = mk ?loc ?attrs (Pexp_index (a, b, c))
177178
let array ?loc ?attrs a = mk ?loc ?attrs (Pexp_array a)
178179
let ifthenelse ?loc ?attrs a b c = mk ?loc ?attrs (Pexp_ifthenelse (a, b, c))
179180
let sequence ?loc ?attrs a b = mk ?loc ?attrs (Pexp_sequence (a, b))

compiler/ml/ast_helper.mli

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,13 @@ module Exp : sig
163163
val field : ?loc:loc -> ?attrs:attrs -> expression -> lid -> expression
164164
val setfield :
165165
?loc:loc -> ?attrs:attrs -> expression -> lid -> expression -> expression
166+
val index :
167+
?loc:loc ->
168+
?attrs:attrs ->
169+
expression ->
170+
expression ->
171+
expression option ->
172+
expression
166173
val array : ?loc:loc -> ?attrs:attrs -> expression list -> expression
167174
val ifthenelse :
168175
?loc:loc ->

compiler/ml/ast_iterator.ml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,10 @@ module E = struct
321321
sub.expr sub e1;
322322
iter_loc sub lid;
323323
sub.expr sub e2
324+
| Pexp_index (e1, e2, e3) ->
325+
sub.expr sub e1;
326+
sub.expr sub e2;
327+
iter_opt (sub.expr sub) e3
324328
| Pexp_array el -> List.iter (sub.expr sub) el
325329
| Pexp_ifthenelse (e1, e2, e3) ->
326330
sub.expr sub e1;

compiler/ml/ast_mapper.ml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,9 @@ module E = struct
313313
field ~loc ~attrs (sub.expr sub e) (map_loc sub lid)
314314
| Pexp_setfield (e1, lid, e2) ->
315315
setfield ~loc ~attrs (sub.expr sub e1) (map_loc sub lid) (sub.expr sub e2)
316+
| Pexp_index (e1, e2, e3) ->
317+
index ~loc ~attrs (sub.expr sub e1) (sub.expr sub e2)
318+
(map_opt (sub.expr sub) e3)
316319
| Pexp_array el -> array ~loc ~attrs (List.map (sub.expr sub) el)
317320
| Pexp_ifthenelse (e1, e2, e3) ->
318321
ifthenelse ~loc ~attrs (sub.expr sub e1) (sub.expr sub e2)

compiler/ml/parsetree.ml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,9 @@ and expression_desc =
279279
*)
280280
| Pexp_field of expression * Longident.t loc (* E.l *)
281281
| Pexp_setfield of expression * Longident.t loc * expression (* E1.l <- E2 *)
282+
| Pexp_index of expression * expression * expression option
283+
(* E1[E2] (None) - read access
284+
E1[E2] = E3 (Some E3) - write access *)
282285
| Pexp_array of expression list (* [| E1; ...; En |] *)
283286
| Pexp_ifthenelse of expression * expression * expression option
284287
(* if E1 then E2 else E3 *)

compiler/ml/pprintast.ml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -691,6 +691,11 @@ and expression ctxt f x =
691691
| Pexp_setfield (e1, li, e2) ->
692692
pp f "@[<2>%a.%a@ <-@ %a@]" (simple_expr ctxt) e1 longident_loc li
693693
(simple_expr ctxt) e2
694+
| Pexp_index (e1, e2, None) ->
695+
pp f "%a.(%a)" (expression ctxt) e1 (expression ctxt) e2
696+
| Pexp_index (e1, e2, Some e3) ->
697+
pp f "%a.(%a)@ <-@ %a" (expression ctxt) e1 (expression ctxt) e2
698+
(expression ctxt) e3
694699
| Pexp_ifthenelse (e1, e2, eo) ->
695700
(* @;@[<2>else@ %a@]@] *)
696701
let fmt : (_, _, _) format =

compiler/ml/printast.ml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,16 @@ and expression i ppf x =
294294
expression i ppf e1;
295295
longident_loc i ppf li;
296296
expression i ppf e2
297+
| Pexp_index (e1, e2, e3) -> (
298+
line i ppf "Pexp_index\n";
299+
expression i ppf e1;
300+
line i ppf "index:\n";
301+
expression i ppf e2;
302+
match e3 with
303+
| None -> line i ppf "read access\n"
304+
| Some e ->
305+
line i ppf "write access:\n";
306+
expression i ppf e)
297307
| Pexp_array l ->
298308
line i ppf "Pexp_array\n";
299309
list i expression ppf l

compiler/ml/tast_iterator.ml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,10 @@ let expr sub {exp_extra; exp_desc; exp_env; _} =
176176
| Texp_setfield (exp1, _, _, exp2) ->
177177
sub.expr sub exp1;
178178
sub.expr sub exp2
179+
| Texp_index (exp1, exp2, expo) ->
180+
sub.expr sub exp1;
181+
sub.expr sub exp2;
182+
Option.iter (sub.expr sub) expo
179183
| Texp_array list -> List.iter (sub.expr sub) list
180184
| Texp_ifthenelse (exp1, exp2, expo) ->
181185
sub.expr sub exp1;

compiler/ml/tast_mapper.ml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,8 @@ let expr sub x =
232232
| Texp_field (exp, lid, ld) -> Texp_field (sub.expr sub exp, lid, ld)
233233
| Texp_setfield (exp1, lid, ld, exp2) ->
234234
Texp_setfield (sub.expr sub exp1, lid, ld, sub.expr sub exp2)
235+
| Texp_index (exp1, exp2, expo) ->
236+
Texp_index (sub.expr sub exp1, sub.expr sub exp2, opt (sub.expr sub) expo)
235237
| Texp_array list -> Texp_array (List.map (sub.expr sub) list)
236238
| Texp_ifthenelse (exp1, exp2, expo) ->
237239
Texp_ifthenelse

compiler/ml/translcore.ml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -891,6 +891,18 @@ and transl_exp0 (e : Typedtree.expression) : Lambda.lambda =
891891
Psetfield (lbl.lbl_pos + 1, Lambda.fld_record_extension_set lbl)
892892
in
893893
Lprim (access, [transl_exp arg; transl_exp newval], e.exp_loc)
894+
| Texp_index (container, index, value_opt) -> (
895+
let container_lambda = transl_exp container in
896+
let index_lambda = transl_exp index in
897+
match value_opt with
898+
| None ->
899+
(* Read: translate to Parrayrefu primitive (unsafe array get) *)
900+
Lprim (Parrayrefu, [container_lambda; index_lambda], e.exp_loc)
901+
| Some value ->
902+
(* Write: translate to Parraysetu primitive (unsafe array set) *)
903+
let value_lambda = transl_exp value in
904+
Lprim
905+
(Parraysetu, [container_lambda; index_lambda; value_lambda], e.exp_loc))
894906
| Texp_array expr_list ->
895907
let ll = transl_list expr_list in
896908
Lprim (Pmakearray Mutable, ll, e.exp_loc)

0 commit comments

Comments
 (0)