Commence moving pexp into ast, for eventual merger with expr.

This commit is contained in:
Graydon Hoare 2010-09-14 18:59:14 -07:00
parent b504b3f8d5
commit c61d021f6d
3 changed files with 158 additions and 154 deletions

View File

@ -324,6 +324,37 @@ and expr =
| EXPR_unary of (unop * atom) | EXPR_unary of (unop * atom)
| EXPR_atom of atom | EXPR_atom of atom
(* FIXME: The redundancy between exprs and pexps is temporary.
* it'll just take a large-ish number of revisions to eliminate. *)
and pexp' =
PEXP_call of (pexp * pexp array)
| PEXP_spawn of (domain * string * pexp)
| PEXP_bind of (pexp * pexp option array)
| PEXP_rec of ((ident * mutability * pexp) array * pexp option)
| PEXP_tup of ((mutability * pexp) array)
| PEXP_vec of mutability * (pexp array)
| PEXP_port
| PEXP_chan of (pexp option)
| PEXP_binop of (binop * pexp * pexp)
| PEXP_lazy_and of (pexp * pexp)
| PEXP_lazy_or of (pexp * pexp)
| PEXP_unop of (unop * pexp)
| PEXP_lval of plval
| PEXP_lit of lit
| PEXP_str of string
| PEXP_box of mutability * pexp
| PEXP_custom of name * (pexp array) * (string option)
and plval =
PLVAL_ident of ident
| PLVAL_app of (ident * (ty array))
| PLVAL_ext_name of (pexp * name_component)
| PLVAL_ext_pexp of (pexp * pexp)
| PLVAL_ext_deref of pexp
and pexp = pexp' Common.identified
and lit = and lit =
| LIT_nil | LIT_nil
| LIT_bool of bool | LIT_bool of bool
@ -375,7 +406,6 @@ and unop =
| UNOP_neg | UNOP_neg
| UNOP_cast of ty identified | UNOP_cast of ty identified
and header_slots = ((slot identified) * ident) array and header_slots = ((slot identified) * ident) array
and header_tup = (slot identified) array and header_tup = (slot identified) array

View File

@ -25,9 +25,9 @@ open Parser;;
* *
*) *)
type meta = (Ast.ident * Pexp.pexp) array;; type meta = (Ast.ident * Ast.pexp) array;;
type meta_pat = (Ast.ident * (Pexp.pexp option)) array;; type meta_pat = (Ast.ident * (Ast.pexp option)) array;;
type auth = (Ast.name * Ast.effect);; type auth = (Ast.name * Ast.effect);;
@ -42,22 +42,22 @@ type cexp =
| CEXP_auth of auth identified | CEXP_auth of auth identified
and cexp_alt = and cexp_alt =
{ alt_val: Pexp.pexp; { alt_val: Ast.pexp;
alt_arms: (Pexp.pexp * cexp array) array; alt_arms: (Ast.pexp * cexp array) array;
alt_else: cexp array } alt_else: cexp array }
and cexp_let = and cexp_let =
{ let_ident: Ast.ident; { let_ident: Ast.ident;
let_value: Pexp.pexp; let_value: Ast.pexp;
let_body: cexp array; } let_body: cexp array; }
and cexp_src = and cexp_src =
{ src_ident: Ast.ident; { src_ident: Ast.ident;
src_path: Pexp.pexp option } src_path: Ast.pexp option }
and cexp_dir = and cexp_dir =
{ dir_ident: Ast.ident; { dir_ident: Ast.ident;
dir_path: Pexp.pexp option; dir_path: Ast.pexp option;
dir_body: cexp array } dir_body: cexp array }
and cexp_use = and cexp_use =
@ -67,7 +67,7 @@ and cexp_use =
and cexp_nat = and cexp_nat =
{ nat_abi: string; { nat_abi: string;
nat_ident: Ast.ident; nat_ident: Ast.ident;
nat_path: Pexp.pexp option; nat_path: Ast.pexp option;
(* (*
* FIXME: possibly support embedding optional strings as * FIXME: possibly support embedding optional strings as
* symbol-names, to handle mangling schemes that aren't * symbol-names, to handle mangling schemes that aren't
@ -80,7 +80,7 @@ and cexp_nat =
(* Cexp grammar. *) (* Cexp grammar. *)
let parse_meta_input (ps:pstate) : (Ast.ident * Pexp.pexp option) = let parse_meta_input (ps:pstate) : (Ast.ident * Ast.pexp option) =
let lab = (ctxt "meta input: label" Pexp.parse_ident ps) in let lab = (ctxt "meta input: label" Pexp.parse_ident ps) in
match peek ps with match peek ps with
EQ -> EQ ->
@ -120,7 +120,7 @@ let parse_optional_meta_pat
LPAREN -> parse_meta_pat ps LPAREN -> parse_meta_pat ps
| _ -> | _ ->
let apos = lexpos ps in let apos = lexpos ps in
[| ("name", Some (span ps apos apos (Pexp.PEXP_str ident))) |] [| ("name", Some (span ps apos apos (Ast.PEXP_str ident))) |]
;; ;;
let rec parse_cexps (ps:pstate) (term:Token.token) : cexp array = let rec parse_cexps (ps:pstate) (term:Token.token) : cexp array =
@ -282,7 +282,7 @@ and parse_cexp (ps:pstate) : cexp =
| _ -> raise (unexpected ps) | _ -> raise (unexpected ps)
and parse_eq_pexp_opt (ps:pstate) : Pexp.pexp option = and parse_eq_pexp_opt (ps:pstate) : Ast.pexp option =
match peek ps with match peek ps with
EQ -> EQ ->
begin begin
@ -493,9 +493,9 @@ and eval_cexp (env:env) (exp:cexp) : cdir array =
| CEXP_auth a -> [| CDIR_auth a.node |] | CEXP_auth a -> [| CDIR_auth a.node |]
and eval_pexp (env:env) (exp:Pexp.pexp) : pval = and eval_pexp (env:env) (exp:Ast.pexp) : pval =
match exp.node with match exp.node with
| Pexp.PEXP_binop (bop, a, b) -> | Ast.PEXP_binop (bop, a, b) ->
begin begin
let av = eval_pexp env a in let av = eval_pexp env a in
let bv = eval_pexp env b in let bv = eval_pexp env b in
@ -518,7 +518,7 @@ and eval_pexp (env:env) (exp:Pexp.pexp) : pval =
end end
end end
| Pexp.PEXP_unop (uop, a) -> | Ast.PEXP_unop (uop, a) ->
begin begin
match uop with match uop with
Ast.UNOP_not -> Ast.UNOP_not ->
@ -528,7 +528,7 @@ and eval_pexp (env:env) (exp:Pexp.pexp) : pval =
| _ -> bug () "Unexpected unop in Cexp.eval_pexp" | _ -> bug () "Unexpected unop in Cexp.eval_pexp"
end end
| Pexp.PEXP_lval (Pexp.PLVAL_ident ident) -> | Ast.PEXP_lval (Ast.PLVAL_ident ident) ->
begin begin
match ltab_search !(env.env_bindings) ident with match ltab_search !(env.env_bindings) ident with
None -> raise (err (Printf.sprintf "no binding for '%s' found" None -> raise (err (Printf.sprintf "no binding for '%s' found"
@ -536,21 +536,21 @@ and eval_pexp (env:env) (exp:Pexp.pexp) : pval =
| Some v -> v | Some v -> v
end end
| Pexp.PEXP_lit (Ast.LIT_bool b) -> | Ast.PEXP_lit (Ast.LIT_bool b) ->
PVAL_bool b PVAL_bool b
| Pexp.PEXP_lit (Ast.LIT_int i) | Ast.PEXP_lit (Ast.LIT_int i)
| Pexp.PEXP_lit (Ast.LIT_uint i) | Ast.PEXP_lit (Ast.LIT_uint i)
| Pexp.PEXP_lit (Ast.LIT_mach_int (_, i)) -> | Ast.PEXP_lit (Ast.LIT_mach_int (_, i)) ->
PVAL_num i PVAL_num i
| Pexp.PEXP_str s -> | Ast.PEXP_str s ->
PVAL_str s PVAL_str s
| _ -> bug () "unexpected Pexp in Cexp.eval_pexp" | _ -> bug () "unexpected Pexp in Cexp.eval_pexp"
and eval_pexp_to_str (env:env) (exp:Pexp.pexp) : string = and eval_pexp_to_str (env:env) (exp:Ast.pexp) : string =
match eval_pexp env exp with match eval_pexp env exp with
PVAL_str s -> s PVAL_str s -> s
| v -> unexpected_val "str" v | v -> unexpected_val "str" v
@ -560,10 +560,10 @@ and need_num (cv:pval) : int64 =
PVAL_num n -> n PVAL_num n -> n
| v -> unexpected_val "num" v | v -> unexpected_val "num" v
and eval_pexp_to_num (env:env) (exp:Pexp.pexp) : int64 = and eval_pexp_to_num (env:env) (exp:Ast.pexp) : int64 =
need_num (eval_pexp env exp) need_num (eval_pexp env exp)
and eval_pexp_to_bool (env:env) (exp:Pexp.pexp) : bool = and eval_pexp_to_bool (env:env) (exp:Ast.pexp) : bool =
match eval_pexp env exp with match eval_pexp env exp with
PVAL_bool b -> b PVAL_bool b -> b
| v -> unexpected_val "bool" v | v -> unexpected_val "bool" v

View File

@ -16,35 +16,6 @@ open Parser;;
* routine. * routine.
*) *)
type pexp' =
PEXP_call of (pexp * pexp array)
| PEXP_spawn of (Ast.domain * string * pexp)
| PEXP_bind of (pexp * pexp option array)
| PEXP_rec of ((Ast.ident * Ast.mutability * pexp) array * pexp option)
| PEXP_tup of ((Ast.mutability * pexp) array)
| PEXP_vec of Ast.mutability * (pexp array)
| PEXP_port
| PEXP_chan of (pexp option)
| PEXP_binop of (Ast.binop * pexp * pexp)
| PEXP_lazy_and of (pexp * pexp)
| PEXP_lazy_or of (pexp * pexp)
| PEXP_unop of (Ast.unop * pexp)
| PEXP_lval of plval
| PEXP_lit of Ast.lit
| PEXP_str of string
| PEXP_box of Ast.mutability * pexp
| PEXP_custom of Ast.name * (pexp array) * (string option)
and plval =
PLVAL_ident of Ast.ident
| PLVAL_app of (Ast.ident * (Ast.ty array))
| PLVAL_ext_name of (pexp * Ast.name_component)
| PLVAL_ext_pexp of (pexp * pexp)
| PLVAL_ext_deref of pexp
and pexp = pexp' Common.identified
;;
(* Pexp grammar. Includes names, idents, types, constrs, binops and unops, (* Pexp grammar. Includes names, idents, types, constrs, binops and unops,
etc. *) etc. *)
@ -407,7 +378,8 @@ and parse_ty (ps:pstate) : Ast.ty =
parse_constrained_ty ps parse_constrained_ty ps
and parse_rec_input (ps:pstate) : (Ast.ident * Ast.mutability * pexp) = and parse_rec_input (ps:pstate)
: (Ast.ident * Ast.mutability * Ast.pexp) =
let mutability = parse_mutability ps in let mutability = parse_mutability ps in
let lab = (ctxt "rec input: label" parse_ident ps) in let lab = (ctxt "rec input: label" parse_ident ps) in
match peek ps with match peek ps with
@ -418,11 +390,11 @@ and parse_rec_input (ps:pstate) : (Ast.ident * Ast.mutability * pexp) =
| _ -> raise (unexpected ps) | _ -> raise (unexpected ps)
and parse_rec_body (ps:pstate) : pexp' = (*((Ast.ident * pexp) array) =*) and parse_rec_body (ps:pstate) : Ast.pexp' =
begin begin
expect ps LPAREN; expect ps LPAREN;
match peek ps with match peek ps with
RPAREN -> PEXP_rec ([||], None) RPAREN -> Ast.PEXP_rec ([||], None)
| WITH -> raise (err "empty record extension" ps) | WITH -> raise (err "empty record extension" ps)
| _ -> | _ ->
let inputs = one_or_more COMMA parse_rec_input ps in let inputs = one_or_more COMMA parse_rec_input ps in
@ -430,7 +402,7 @@ and parse_rec_body (ps:pstate) : pexp' = (*((Ast.ident * pexp) array) =*)
begin begin
check_dup_rec_labels ps labels; check_dup_rec_labels ps labels;
match peek ps with match peek ps with
RPAREN -> (bump ps; PEXP_rec (inputs, None)) RPAREN -> (bump ps; Ast.PEXP_rec (inputs, None))
| WITH -> | WITH ->
begin begin
bump ps; bump ps;
@ -439,7 +411,7 @@ and parse_rec_body (ps:pstate) : pexp' = (*((Ast.ident * pexp) array) =*)
parse_pexp ps parse_pexp ps
in in
expect ps RPAREN; expect ps RPAREN;
PEXP_rec (inputs, Some base) Ast.PEXP_rec (inputs, Some base)
end end
| _ -> raise (err "expected 'with' or ')'" ps) | _ -> raise (err "expected 'with' or ')'" ps)
end end
@ -456,7 +428,7 @@ and parse_lit (ps:pstate) : Ast.lit =
| _ -> raise (unexpected ps) | _ -> raise (unexpected ps)
and parse_bottom_pexp (ps:pstate) : pexp = and parse_bottom_pexp (ps:pstate) : Ast.pexp =
check_rstr_start ps; check_rstr_start ps;
let apos = lexpos ps in let apos = lexpos ps in
match peek ps with match peek ps with
@ -466,7 +438,7 @@ and parse_bottom_pexp (ps:pstate) : pexp =
let mutability = parse_mutability ps in let mutability = parse_mutability ps in
let inner = parse_pexp ps in let inner = parse_pexp ps in
let bpos = lexpos ps in let bpos = lexpos ps in
span ps apos bpos (PEXP_box (mutability, inner)) span ps apos bpos (Ast.PEXP_box (mutability, inner))
| TUP -> | TUP ->
bump ps; bump ps;
@ -474,7 +446,7 @@ and parse_bottom_pexp (ps:pstate) : pexp =
ctxt "paren pexps(s)" (rstr false parse_mutable_and_pexp_list) ps ctxt "paren pexps(s)" (rstr false parse_mutable_and_pexp_list) ps
in in
let bpos = lexpos ps in let bpos = lexpos ps in
span ps apos bpos (PEXP_tup pexps) span ps apos bpos (Ast.PEXP_tup pexps)
| REC -> | REC ->
bump ps; bump ps;
@ -495,13 +467,13 @@ and parse_bottom_pexp (ps:pstate) : pexp =
in in
let pexps = ctxt "vec pexp: exprs" parse_pexp_list ps in let pexps = ctxt "vec pexp: exprs" parse_pexp_list ps in
let bpos = lexpos ps in let bpos = lexpos ps in
span ps apos bpos (PEXP_vec (mutability, pexps)) span ps apos bpos (Ast.PEXP_vec (mutability, pexps))
| LIT_STR s -> | LIT_STR s ->
bump ps; bump ps;
let bpos = lexpos ps in let bpos = lexpos ps in
span ps apos bpos (PEXP_str s) span ps apos bpos (Ast.PEXP_str s)
| PORT -> | PORT ->
begin begin
@ -509,7 +481,7 @@ and parse_bottom_pexp (ps:pstate) : pexp =
expect ps LPAREN; expect ps LPAREN;
expect ps RPAREN; expect ps RPAREN;
let bpos = lexpos ps in let bpos = lexpos ps in
span ps apos bpos (PEXP_port) span ps apos bpos (Ast.PEXP_port)
end end
| CHAN -> | CHAN ->
@ -530,7 +502,7 @@ and parse_bottom_pexp (ps:pstate) : pexp =
| _ -> raise (unexpected ps) | _ -> raise (unexpected ps)
in in
let bpos = lexpos ps in let bpos = lexpos ps in
span ps apos bpos (PEXP_chan port) span ps apos bpos (Ast.PEXP_chan port)
end end
| SPAWN -> | SPAWN ->
@ -560,7 +532,7 @@ and parse_bottom_pexp (ps:pstate) : pexp =
characters *) characters *)
| None -> Session.string_of_span { lo = apos; hi = bpos } | None -> Session.string_of_span { lo = apos; hi = bpos }
in in
span ps apos bpos (PEXP_spawn (domain, name, pexp)) span ps apos bpos (Ast.PEXP_spawn (domain, name, pexp))
| BIND -> | BIND ->
let apos = lexpos ps in let apos = lexpos ps in
@ -572,7 +544,7 @@ and parse_bottom_pexp (ps:pstate) : pexp =
(paren_comma_list parse_bind_arg) ps (paren_comma_list parse_bind_arg) ps
in in
let bpos = lexpos ps in let bpos = lexpos ps in
span ps apos bpos (PEXP_bind (pexp, args)) span ps apos bpos (Ast.PEXP_bind (pexp, args))
end end
| IDENT i -> | IDENT i ->
@ -587,13 +559,13 @@ and parse_bottom_pexp (ps:pstate) : pexp =
(Some COMMA) parse_ty) ps (Some COMMA) parse_ty) ps
in in
let bpos = lexpos ps in let bpos = lexpos ps in
span ps apos bpos (PEXP_lval (PLVAL_app (i, tys))) span ps apos bpos (Ast.PEXP_lval (Ast.PLVAL_app (i, tys)))
end end
| _ -> | _ ->
begin begin
let bpos = lexpos ps in let bpos = lexpos ps in
span ps apos bpos (PEXP_lval (PLVAL_ident i)) span ps apos bpos (Ast.PEXP_lval (Ast.PLVAL_ident i))
end end
end end
@ -602,7 +574,7 @@ and parse_bottom_pexp (ps:pstate) : pexp =
bump ps; bump ps;
let inner = parse_pexp ps in let inner = parse_pexp ps in
let bpos = lexpos ps in let bpos = lexpos ps in
span ps apos bpos (PEXP_lval (PLVAL_ext_deref inner)) span ps apos bpos (Ast.PEXP_lval (Ast.PLVAL_ext_deref inner))
| POUND -> | POUND ->
bump ps; bump ps;
@ -626,7 +598,7 @@ and parse_bottom_pexp (ps:pstate) : pexp =
in in
let bpos = lexpos ps in let bpos = lexpos ps in
span ps apos bpos span ps apos bpos
(PEXP_custom (name, args, str)) (Ast.PEXP_custom (name, args, str))
| LPAREN -> | LPAREN ->
begin begin
@ -635,7 +607,7 @@ and parse_bottom_pexp (ps:pstate) : pexp =
RPAREN -> RPAREN ->
bump ps; bump ps;
let bpos = lexpos ps in let bpos = lexpos ps in
span ps apos bpos (PEXP_lit Ast.LIT_nil) span ps apos bpos (Ast.PEXP_lit Ast.LIT_nil)
| _ -> | _ ->
let pexp = parse_pexp ps in let pexp = parse_pexp ps in
expect ps RPAREN; expect ps RPAREN;
@ -645,16 +617,16 @@ and parse_bottom_pexp (ps:pstate) : pexp =
| _ -> | _ ->
let lit = parse_lit ps in let lit = parse_lit ps in
let bpos = lexpos ps in let bpos = lexpos ps in
span ps apos bpos (PEXP_lit lit) span ps apos bpos (Ast.PEXP_lit lit)
and parse_bind_arg (ps:pstate) : pexp option = and parse_bind_arg (ps:pstate) : Ast.pexp option =
match peek ps with match peek ps with
UNDERSCORE -> (bump ps; None) UNDERSCORE -> (bump ps; None)
| _ -> Some (parse_pexp ps) | _ -> Some (parse_pexp ps)
and parse_ext_pexp (ps:pstate) (pexp:pexp) : pexp = and parse_ext_pexp (ps:pstate) (pexp:Ast.pexp) : Ast.pexp =
let apos = lexpos ps in let apos = lexpos ps in
match peek ps with match peek ps with
LPAREN -> LPAREN ->
@ -663,7 +635,7 @@ and parse_ext_pexp (ps:pstate) (pexp:pexp) : pexp =
else else
let args = parse_pexp_list ps in let args = parse_pexp_list ps in
let bpos = lexpos ps in let bpos = lexpos ps in
let ext = span ps apos bpos (PEXP_call (pexp, args)) in let ext = span ps apos bpos (Ast.PEXP_call (pexp, args)) in
parse_ext_pexp ps ext parse_ext_pexp ps ext
| DOT -> | DOT ->
@ -677,12 +649,12 @@ and parse_ext_pexp (ps:pstate) (pexp:pexp) : pexp =
expect ps RPAREN; expect ps RPAREN;
let bpos = lexpos ps in let bpos = lexpos ps in
span ps apos bpos span ps apos bpos
(PEXP_lval (PLVAL_ext_pexp (pexp, rhs))) (Ast.PEXP_lval (Ast.PLVAL_ext_pexp (pexp, rhs)))
| _ -> | _ ->
let rhs = parse_name_component ps in let rhs = parse_name_component ps in
let bpos = lexpos ps in let bpos = lexpos ps in
span ps apos bpos span ps apos bpos
(PEXP_lval (PLVAL_ext_name (pexp, rhs))) (Ast.PEXP_lval (Ast.PLVAL_ext_name (pexp, rhs)))
in in
parse_ext_pexp ps ext parse_ext_pexp ps ext
end end
@ -690,26 +662,26 @@ and parse_ext_pexp (ps:pstate) (pexp:pexp) : pexp =
| _ -> pexp | _ -> pexp
and parse_negation_pexp (ps:pstate) : pexp = and parse_negation_pexp (ps:pstate) : Ast.pexp =
let apos = lexpos ps in let apos = lexpos ps in
match peek ps with match peek ps with
NOT -> NOT ->
bump ps; bump ps;
let rhs = ctxt "negation pexp" parse_negation_pexp ps in let rhs = ctxt "negation pexp" parse_negation_pexp ps in
let bpos = lexpos ps in let bpos = lexpos ps in
span ps apos bpos (PEXP_unop (Ast.UNOP_not, rhs)) span ps apos bpos (Ast.PEXP_unop (Ast.UNOP_not, rhs))
| TILDE -> | TILDE ->
bump ps; bump ps;
let rhs = ctxt "negation pexp" parse_negation_pexp ps in let rhs = ctxt "negation pexp" parse_negation_pexp ps in
let bpos = lexpos ps in let bpos = lexpos ps in
span ps apos bpos (PEXP_unop (Ast.UNOP_bitnot, rhs)) span ps apos bpos (Ast.PEXP_unop (Ast.UNOP_bitnot, rhs))
| MINUS -> | MINUS ->
bump ps; bump ps;
let rhs = ctxt "negation pexp" parse_negation_pexp ps in let rhs = ctxt "negation pexp" parse_negation_pexp ps in
let bpos = lexpos ps in let bpos = lexpos ps in
span ps apos bpos (PEXP_unop (Ast.UNOP_neg, rhs)) span ps apos bpos (Ast.PEXP_unop (Ast.UNOP_neg, rhs))
| _ -> | _ ->
let lhs = parse_bottom_pexp ps in let lhs = parse_bottom_pexp ps in
@ -722,19 +694,19 @@ and binop_build
(ps:pstate) (ps:pstate)
(name:string) (name:string)
(apos:pos) (apos:pos)
(rhs_parse_fn:pstate -> pexp) (rhs_parse_fn:pstate -> Ast.pexp)
(lhs:pexp) (lhs:Ast.pexp)
(step_fn:pexp -> pexp) (step_fn:Ast.pexp -> Ast.pexp)
(op:Ast.binop) (op:Ast.binop)
: pexp = : Ast.pexp =
bump ps; bump ps;
let rhs = (ctxt (name ^ " rhs") rhs_parse_fn ps) in let rhs = (ctxt (name ^ " rhs") rhs_parse_fn ps) in
let bpos = lexpos ps in let bpos = lexpos ps in
let node = span ps apos bpos (PEXP_binop (op, lhs, rhs)) in let node = span ps apos bpos (Ast.PEXP_binop (op, lhs, rhs)) in
step_fn node step_fn node
and parse_factor_pexp (ps:pstate) : pexp = and parse_factor_pexp (ps:pstate) : Ast.pexp =
let name = "factor pexp" in let name = "factor pexp" in
let apos = lexpos ps in let apos = lexpos ps in
let lhs = ctxt (name ^ " lhs") parse_negation_pexp ps in let lhs = ctxt (name ^ " lhs") parse_negation_pexp ps in
@ -749,7 +721,7 @@ and parse_factor_pexp (ps:pstate) : pexp =
step lhs step lhs
and parse_term_pexp (ps:pstate) : pexp = and parse_term_pexp (ps:pstate) : Ast.pexp =
let name = "term pexp" in let name = "term pexp" in
let apos = lexpos ps in let apos = lexpos ps in
let lhs = ctxt (name ^ " lhs") parse_factor_pexp ps in let lhs = ctxt (name ^ " lhs") parse_factor_pexp ps in
@ -763,7 +735,7 @@ and parse_term_pexp (ps:pstate) : pexp =
step lhs step lhs
and parse_shift_pexp (ps:pstate) : pexp = and parse_shift_pexp (ps:pstate) : Ast.pexp =
let name = "shift pexp" in let name = "shift pexp" in
let apos = lexpos ps in let apos = lexpos ps in
let lhs = ctxt (name ^ " lhs") parse_term_pexp ps in let lhs = ctxt (name ^ " lhs") parse_term_pexp ps in
@ -778,7 +750,7 @@ and parse_shift_pexp (ps:pstate) : pexp =
step lhs step lhs
and parse_and_pexp (ps:pstate) : pexp = and parse_and_pexp (ps:pstate) : Ast.pexp =
let name = "and pexp" in let name = "and pexp" in
let apos = lexpos ps in let apos = lexpos ps in
let lhs = ctxt (name ^ " lhs") parse_shift_pexp ps in let lhs = ctxt (name ^ " lhs") parse_shift_pexp ps in
@ -791,7 +763,7 @@ and parse_and_pexp (ps:pstate) : pexp =
step lhs step lhs
and parse_xor_pexp (ps:pstate) : pexp = and parse_xor_pexp (ps:pstate) : Ast.pexp =
let name = "xor pexp" in let name = "xor pexp" in
let apos = lexpos ps in let apos = lexpos ps in
let lhs = ctxt (name ^ " lhs") parse_and_pexp ps in let lhs = ctxt (name ^ " lhs") parse_and_pexp ps in
@ -804,7 +776,7 @@ and parse_xor_pexp (ps:pstate) : pexp =
step lhs step lhs
and parse_or_pexp (ps:pstate) : pexp = and parse_or_pexp (ps:pstate) : Ast.pexp =
let name = "or pexp" in let name = "or pexp" in
let apos = lexpos ps in let apos = lexpos ps in
let lhs = ctxt (name ^ " lhs") parse_xor_pexp ps in let lhs = ctxt (name ^ " lhs") parse_xor_pexp ps in
@ -817,7 +789,7 @@ and parse_or_pexp (ps:pstate) : pexp =
step lhs step lhs
and parse_as_pexp (ps:pstate) : pexp = and parse_as_pexp (ps:pstate) : Ast.pexp =
let apos = lexpos ps in let apos = lexpos ps in
let pexp = ctxt "as pexp" parse_or_pexp ps in let pexp = ctxt "as pexp" parse_or_pexp ps in
let rec step accum = let rec step accum =
@ -830,7 +802,7 @@ and parse_as_pexp (ps:pstate) : pexp =
let t = span ps tapos bpos t in let t = span ps tapos bpos t in
let node = let node =
span ps apos bpos span ps apos bpos
(PEXP_unop ((Ast.UNOP_cast t), accum)) (Ast.PEXP_unop ((Ast.UNOP_cast t), accum))
in in
step node step node
@ -839,7 +811,7 @@ and parse_as_pexp (ps:pstate) : pexp =
step pexp step pexp
and parse_relational_pexp (ps:pstate) : pexp = and parse_relational_pexp (ps:pstate) : Ast.pexp =
let name = "relational pexp" in let name = "relational pexp" in
let apos = lexpos ps in let apos = lexpos ps in
let lhs = ctxt (name ^ " lhs") parse_as_pexp ps in let lhs = ctxt (name ^ " lhs") parse_as_pexp ps in
@ -855,7 +827,7 @@ and parse_relational_pexp (ps:pstate) : pexp =
step lhs step lhs
and parse_equality_pexp (ps:pstate) : pexp = and parse_equality_pexp (ps:pstate) : Ast.pexp =
let name = "equality pexp" in let name = "equality pexp" in
let apos = lexpos ps in let apos = lexpos ps in
let lhs = ctxt (name ^ " lhs") parse_relational_pexp ps in let lhs = ctxt (name ^ " lhs") parse_relational_pexp ps in
@ -869,7 +841,7 @@ and parse_equality_pexp (ps:pstate) : pexp =
step lhs step lhs
and parse_andand_pexp (ps:pstate) : pexp = and parse_andand_pexp (ps:pstate) : Ast.pexp =
let name = "andand pexp" in let name = "andand pexp" in
let apos = lexpos ps in let apos = lexpos ps in
let lhs = ctxt (name ^ " lhs") parse_equality_pexp ps in let lhs = ctxt (name ^ " lhs") parse_equality_pexp ps in
@ -879,7 +851,7 @@ and parse_andand_pexp (ps:pstate) : pexp =
bump ps; bump ps;
let rhs = parse_equality_pexp ps in let rhs = parse_equality_pexp ps in
let bpos = lexpos ps in let bpos = lexpos ps in
let node = span ps apos bpos (PEXP_lazy_and (accum, rhs)) in let node = span ps apos bpos (Ast.PEXP_lazy_and (accum, rhs)) in
step node step node
| _ -> accum | _ -> accum
@ -887,7 +859,7 @@ and parse_andand_pexp (ps:pstate) : pexp =
step lhs step lhs
and parse_oror_pexp (ps:pstate) : pexp = and parse_oror_pexp (ps:pstate) : Ast.pexp =
let name = "oror pexp" in let name = "oror pexp" in
let apos = lexpos ps in let apos = lexpos ps in
let lhs = ctxt (name ^ " lhs") parse_andand_pexp ps in let lhs = ctxt (name ^ " lhs") parse_andand_pexp ps in
@ -897,7 +869,7 @@ and parse_oror_pexp (ps:pstate) : pexp =
bump ps; bump ps;
let rhs = parse_andand_pexp ps in let rhs = parse_andand_pexp ps in
let bpos = lexpos ps in let bpos = lexpos ps in
let node = span ps apos bpos (PEXP_lazy_or (accum, rhs)) in let node = span ps apos bpos (Ast.PEXP_lazy_or (accum, rhs)) in
step node step node
| _ -> accum | _ -> accum
@ -905,21 +877,22 @@ and parse_oror_pexp (ps:pstate) : pexp =
step lhs step lhs
and parse_pexp (ps:pstate) : pexp = and parse_pexp (ps:pstate) : Ast.pexp =
parse_oror_pexp ps parse_oror_pexp ps
and parse_mutable_and_pexp (ps:pstate) : (Ast.mutability * pexp) = and parse_mutable_and_pexp (ps:pstate) : (Ast.mutability * Ast.pexp) =
let mutability = parse_mutability ps in let mutability = parse_mutability ps in
(mutability, parse_as_pexp ps) (mutability, parse_as_pexp ps)
and parse_pexp_list (ps:pstate) : pexp array = and parse_pexp_list (ps:pstate) : Ast.pexp array =
match peek ps with match peek ps with
LPAREN -> LPAREN ->
bracketed_zero_or_more LPAREN RPAREN (Some COMMA) bracketed_zero_or_more LPAREN RPAREN (Some COMMA)
(ctxt "pexp list" parse_pexp) ps (ctxt "pexp list" parse_pexp) ps
| _ -> raise (unexpected ps) | _ -> raise (unexpected ps)
and parse_mutable_and_pexp_list (ps:pstate) : (Ast.mutability * pexp) array = and parse_mutable_and_pexp_list (ps:pstate)
: (Ast.mutability * Ast.pexp) array =
match peek ps with match peek ps with
LPAREN -> LPAREN ->
bracketed_zero_or_more LPAREN RPAREN (Some COMMA) bracketed_zero_or_more LPAREN RPAREN (Some COMMA)
@ -981,32 +954,33 @@ let expand_pexp_custom
* result of the pexp is prepended, and the temporary atom is used. * result of the pexp is prepended, and the temporary atom is used.
*) *)
let rec desugar_lval (ps:pstate) (pexp:pexp) : (Ast.stmt array * Ast.lval) = let rec desugar_lval (ps:pstate) (pexp:Ast.pexp)
: (Ast.stmt array * Ast.lval) =
let s = Hashtbl.find ps.pstate_sess.Session.sess_spans pexp.id in let s = Hashtbl.find ps.pstate_sess.Session.sess_spans pexp.id in
let (apos, bpos) = (s.lo, s.hi) in let (apos, bpos) = (s.lo, s.hi) in
match pexp.node with match pexp.node with
PEXP_lval (PLVAL_ident ident) -> Ast.PEXP_lval (Ast.PLVAL_ident ident) ->
let nb = span ps apos bpos (Ast.BASE_ident ident) in let nb = span ps apos bpos (Ast.BASE_ident ident) in
([||], Ast.LVAL_base nb) ([||], Ast.LVAL_base nb)
| PEXP_lval (PLVAL_app (ident, tys)) -> | Ast.PEXP_lval (Ast.PLVAL_app (ident, tys)) ->
let nb = span ps apos bpos (Ast.BASE_app (ident, tys)) in let nb = span ps apos bpos (Ast.BASE_app (ident, tys)) in
([||], Ast.LVAL_base nb) ([||], Ast.LVAL_base nb)
| PEXP_lval (PLVAL_ext_name (base_pexp, comp)) -> | Ast.PEXP_lval (Ast.PLVAL_ext_name (base_pexp, comp)) ->
let (base_stmts, base_atom) = desugar_expr_atom ps base_pexp in let (base_stmts, base_atom) = desugar_expr_atom ps base_pexp in
let base_lval = atom_lval ps base_atom in let base_lval = atom_lval ps base_atom in
(base_stmts, Ast.LVAL_ext (base_lval, Ast.COMP_named comp)) (base_stmts, Ast.LVAL_ext (base_lval, Ast.COMP_named comp))
| PEXP_lval (PLVAL_ext_pexp (base_pexp, ext_pexp)) -> | Ast.PEXP_lval (Ast.PLVAL_ext_pexp (base_pexp, ext_pexp)) ->
let (base_stmts, base_atom) = desugar_expr_atom ps base_pexp in let (base_stmts, base_atom) = desugar_expr_atom ps base_pexp in
let (ext_stmts, ext_atom) = desugar_expr_atom ps ext_pexp in let (ext_stmts, ext_atom) = desugar_expr_atom ps ext_pexp in
let base_lval = atom_lval ps base_atom in let base_lval = atom_lval ps base_atom in
(Array.append base_stmts ext_stmts, (Array.append base_stmts ext_stmts,
Ast.LVAL_ext (base_lval, Ast.COMP_atom (clone_atom ps ext_atom))) Ast.LVAL_ext (base_lval, Ast.COMP_atom (clone_atom ps ext_atom)))
| PEXP_lval (PLVAL_ext_deref base_pexp) -> | Ast.PEXP_lval (Ast.PLVAL_ext_deref base_pexp) ->
let (base_stmts, base_atom) = desugar_expr_atom ps base_pexp in let (base_stmts, base_atom) = desugar_expr_atom ps base_pexp in
let base_lval = atom_lval ps base_atom in let base_lval = atom_lval ps base_atom in
(base_stmts, Ast.LVAL_ext (base_lval, Ast.COMP_deref)) (base_stmts, Ast.LVAL_ext (base_lval, Ast.COMP_deref))
@ -1018,15 +992,15 @@ let rec desugar_lval (ps:pstate) (pexp:pexp) : (Ast.stmt array * Ast.lval) =
and desugar_expr and desugar_expr
(ps:pstate) (ps:pstate)
(pexp:pexp) (pexp:Ast.pexp)
: (Ast.stmt array * Ast.expr) = : (Ast.stmt array * Ast.expr) =
match pexp.node with match pexp.node with
PEXP_unop (op, pe) -> Ast.PEXP_unop (op, pe) ->
let (stmts, at) = desugar_expr_atom ps pe in let (stmts, at) = desugar_expr_atom ps pe in
(stmts, Ast.EXPR_unary (op, at)) (stmts, Ast.EXPR_unary (op, at))
| PEXP_binop (op, lhs, rhs) -> | Ast.PEXP_binop (op, lhs, rhs) ->
let (lhs_stmts, lhs_atom) = desugar_expr_atom ps lhs in let (lhs_stmts, lhs_atom) = desugar_expr_atom ps lhs in
let (rhs_stmts, rhs_atom) = desugar_expr_atom ps rhs in let (rhs_stmts, rhs_atom) = desugar_expr_atom ps rhs in
(Array.append lhs_stmts rhs_stmts, (Array.append lhs_stmts rhs_stmts,
@ -1039,7 +1013,7 @@ and desugar_expr
and desugar_opt_expr_atom and desugar_opt_expr_atom
(ps:pstate) (ps:pstate)
(po:pexp option) (po:Ast.pexp option)
: (Ast.stmt array * Ast.atom option) = : (Ast.stmt array * Ast.atom option) =
match po with match po with
None -> ([| |], None) None -> ([| |], None)
@ -1050,55 +1024,55 @@ and desugar_opt_expr_atom
and desugar_expr_atom and desugar_expr_atom
(ps:pstate) (ps:pstate)
(pexp:pexp) (pexp:Ast.pexp)
: (Ast.stmt array * Ast.atom) = : (Ast.stmt array * Ast.atom) =
let s = Hashtbl.find ps.pstate_sess.Session.sess_spans pexp.id in let s = Hashtbl.find ps.pstate_sess.Session.sess_spans pexp.id in
let (apos, bpos) = (s.lo, s.hi) in let (apos, bpos) = (s.lo, s.hi) in
match pexp.node with match pexp.node with
PEXP_unop _ Ast.PEXP_unop _
| PEXP_binop _ | Ast.PEXP_binop _
| PEXP_lazy_or _ | Ast.PEXP_lazy_or _
| PEXP_lazy_and _ | Ast.PEXP_lazy_and _
| PEXP_rec _ | Ast.PEXP_rec _
| PEXP_tup _ | Ast.PEXP_tup _
| PEXP_str _ | Ast.PEXP_str _
| PEXP_vec _ | Ast.PEXP_vec _
| PEXP_port | Ast.PEXP_port
| PEXP_chan _ | Ast.PEXP_chan _
| PEXP_call _ | Ast.PEXP_call _
| PEXP_bind _ | Ast.PEXP_bind _
| PEXP_spawn _ | Ast.PEXP_spawn _
| PEXP_custom _ | Ast.PEXP_custom _
| PEXP_box _ -> | Ast.PEXP_box _ ->
let (_, tmp, decl_stmt) = build_tmp ps slot_auto apos bpos in let (_, tmp, decl_stmt) = build_tmp ps slot_auto apos bpos in
let stmts = desugar_expr_init ps tmp pexp in let stmts = desugar_expr_init ps tmp pexp in
(Array.append [| decl_stmt |] stmts, (Array.append [| decl_stmt |] stmts,
Ast.ATOM_lval (clone_lval ps tmp)) Ast.ATOM_lval (clone_lval ps tmp))
| PEXP_lit lit -> | Ast.PEXP_lit lit ->
([||], Ast.ATOM_literal (span ps apos bpos lit)) ([||], Ast.ATOM_literal (span ps apos bpos lit))
| PEXP_lval _ -> | Ast.PEXP_lval _ ->
let (stmts, lval) = desugar_lval ps pexp in let (stmts, lval) = desugar_lval ps pexp in
(stmts, Ast.ATOM_lval lval) (stmts, Ast.ATOM_lval lval)
and desugar_expr_atoms and desugar_expr_atoms
(ps:pstate) (ps:pstate)
(pexps:pexp array) (pexps:Ast.pexp array)
: (Ast.stmt array * Ast.atom array) = : (Ast.stmt array * Ast.atom array) =
arj1st (Array.map (desugar_expr_atom ps) pexps) arj1st (Array.map (desugar_expr_atom ps) pexps)
and desugar_opt_expr_atoms and desugar_opt_expr_atoms
(ps:pstate) (ps:pstate)
(pexps:pexp option array) (pexps:Ast.pexp option array)
: (Ast.stmt array * Ast.atom option array) = : (Ast.stmt array * Ast.atom option array) =
arj1st (Array.map (desugar_opt_expr_atom ps) pexps) arj1st (Array.map (desugar_opt_expr_atom ps) pexps)
and desugar_expr_init and desugar_expr_init
(ps:pstate) (ps:pstate)
(dst_lval:Ast.lval) (dst_lval:Ast.lval)
(pexp:pexp) (pexp:Ast.pexp)
: (Ast.stmt array) = : (Ast.stmt array) =
let s = Hashtbl.find ps.pstate_sess.Session.sess_spans pexp.id in let s = Hashtbl.find ps.pstate_sess.Session.sess_spans pexp.id in
let (apos, bpos) = (s.lo, s.hi) in let (apos, bpos) = (s.lo, s.hi) in
@ -1111,12 +1085,12 @@ and desugar_expr_init
match pexp.node with match pexp.node with
PEXP_lit _ Ast.PEXP_lit _
| PEXP_lval _ -> | Ast.PEXP_lval _ ->
let (stmts, atom) = desugar_expr_atom ps pexp in let (stmts, atom) = desugar_expr_atom ps pexp in
aa stmts [| ss (cp (Ast.EXPR_atom atom)) |] aa stmts [| ss (cp (Ast.EXPR_atom atom)) |]
| PEXP_binop (op, lhs, rhs) -> | Ast.PEXP_binop (op, lhs, rhs) ->
let (lhs_stmts, lhs_atom) = desugar_expr_atom ps lhs in let (lhs_stmts, lhs_atom) = desugar_expr_atom ps lhs in
let (rhs_stmts, rhs_atom) = desugar_expr_atom ps rhs in let (rhs_stmts, rhs_atom) = desugar_expr_atom ps rhs in
let copy_stmt = let copy_stmt =
@ -1126,7 +1100,7 @@ and desugar_expr_init
(* x = a && b ==> if (a) { x = b; } else { x = false; } *) (* x = a && b ==> if (a) { x = b; } else { x = false; } *)
| PEXP_lazy_and (lhs, rhs) -> | Ast.PEXP_lazy_and (lhs, rhs) ->
let (lhs_stmts, lhs_atom) = desugar_expr_atom ps lhs in let (lhs_stmts, lhs_atom) = desugar_expr_atom ps lhs in
let (rhs_stmts, rhs_atom) = desugar_expr_atom ps rhs in let (rhs_stmts, rhs_atom) = desugar_expr_atom ps rhs in
let sthen = let sthen =
@ -1145,7 +1119,7 @@ and desugar_expr_init
(* x = a || b ==> if (a) { x = true; } else { x = b; } *) (* x = a || b ==> if (a) { x = true; } else { x = b; } *)
| PEXP_lazy_or (lhs, rhs) -> | Ast.PEXP_lazy_or (lhs, rhs) ->
let (lhs_stmts, lhs_atom) = desugar_expr_atom ps lhs in let (lhs_stmts, lhs_atom) = desugar_expr_atom ps lhs in
let (rhs_stmts, rhs_atom) = desugar_expr_atom ps rhs in let (rhs_stmts, rhs_atom) = desugar_expr_atom ps rhs in
let sthen = let sthen =
@ -1163,30 +1137,30 @@ and desugar_expr_init
aa lhs_stmts [| sif |] aa lhs_stmts [| sif |]
| PEXP_unop (op, rhs) -> | Ast.PEXP_unop (op, rhs) ->
let (rhs_stmts, rhs_atom) = desugar_expr_atom ps rhs in let (rhs_stmts, rhs_atom) = desugar_expr_atom ps rhs in
let expr = Ast.EXPR_unary (op, rhs_atom) in let expr = Ast.EXPR_unary (op, rhs_atom) in
let copy_stmt = ss (cp expr) in let copy_stmt = ss (cp expr) in
aa rhs_stmts [| copy_stmt |] aa rhs_stmts [| copy_stmt |]
| PEXP_call (fn, args) -> | Ast.PEXP_call (fn, args) ->
let (fn_stmts, fn_atom) = desugar_expr_atom ps fn in let (fn_stmts, fn_atom) = desugar_expr_atom ps fn in
let (arg_stmts, arg_atoms) = desugar_expr_atoms ps args in let (arg_stmts, arg_atoms) = desugar_expr_atoms ps args in
let fn_lval = atom_lval ps fn_atom in let fn_lval = atom_lval ps fn_atom in
let call_stmt = ss (Ast.STMT_call (dst_lval, fn_lval, arg_atoms)) in let call_stmt = ss (Ast.STMT_call (dst_lval, fn_lval, arg_atoms)) in
ac [ fn_stmts; arg_stmts; [| call_stmt |] ] ac [ fn_stmts; arg_stmts; [| call_stmt |] ]
| PEXP_bind (fn, args) -> | Ast.PEXP_bind (fn, args) ->
let (fn_stmts, fn_atom) = desugar_expr_atom ps fn in let (fn_stmts, fn_atom) = desugar_expr_atom ps fn in
let (arg_stmts, arg_atoms) = desugar_opt_expr_atoms ps args in let (arg_stmts, arg_atoms) = desugar_opt_expr_atoms ps args in
let fn_lval = atom_lval ps fn_atom in let fn_lval = atom_lval ps fn_atom in
let bind_stmt = ss (Ast.STMT_bind (dst_lval, fn_lval, arg_atoms)) in let bind_stmt = ss (Ast.STMT_bind (dst_lval, fn_lval, arg_atoms)) in
ac [ fn_stmts; arg_stmts; [| bind_stmt |] ] ac [ fn_stmts; arg_stmts; [| bind_stmt |] ]
| PEXP_spawn (domain, name, sub) -> | Ast.PEXP_spawn (domain, name, sub) ->
begin begin
match sub.node with match sub.node with
PEXP_call (fn, args) -> Ast.PEXP_call (fn, args) ->
let (fn_stmts, fn_atom) = desugar_expr_atom ps fn in let (fn_stmts, fn_atom) = desugar_expr_atom ps fn in
let (arg_stmts, arg_atoms) = desugar_expr_atoms ps args in let (arg_stmts, arg_atoms) = desugar_expr_atoms ps args in
let fn_lval = atom_lval ps fn_atom in let fn_lval = atom_lval ps fn_atom in
@ -1198,7 +1172,7 @@ and desugar_expr_init
| _ -> raise (err "non-call spawn" ps) | _ -> raise (err "non-call spawn" ps)
end end
| PEXP_rec (args, base) -> | Ast.PEXP_rec (args, base) ->
let (arg_stmts, entries) = let (arg_stmts, entries) =
arj1st arj1st
begin begin
@ -1229,7 +1203,7 @@ and desugar_expr_init
aa arg_stmts [| rec_stmt |] aa arg_stmts [| rec_stmt |]
end end
| PEXP_tup args -> | Ast.PEXP_tup args ->
let muts = Array.to_list (Array.map fst args) in let muts = Array.to_list (Array.map fst args) in
let (arg_stmts, arg_atoms) = let (arg_stmts, arg_atoms) =
desugar_expr_atoms ps (Array.map snd args) desugar_expr_atoms ps (Array.map snd args)
@ -1239,21 +1213,21 @@ and desugar_expr_init
let stmt = ss (Ast.STMT_new_tup (dst_lval, tup_args)) in let stmt = ss (Ast.STMT_new_tup (dst_lval, tup_args)) in
aa arg_stmts [| stmt |] aa arg_stmts [| stmt |]
| PEXP_str s -> | Ast.PEXP_str s ->
let stmt = ss (Ast.STMT_new_str (dst_lval, s)) in let stmt = ss (Ast.STMT_new_str (dst_lval, s)) in
[| stmt |] [| stmt |]
| PEXP_vec (mutability, args) -> | Ast.PEXP_vec (mutability, args) ->
let (arg_stmts, arg_atoms) = desugar_expr_atoms ps args in let (arg_stmts, arg_atoms) = desugar_expr_atoms ps args in
let stmt = let stmt =
ss (Ast.STMT_new_vec (dst_lval, mutability, arg_atoms)) ss (Ast.STMT_new_vec (dst_lval, mutability, arg_atoms))
in in
aa arg_stmts [| stmt |] aa arg_stmts [| stmt |]
| PEXP_port -> | Ast.PEXP_port ->
[| ss (Ast.STMT_new_port dst_lval) |] [| ss (Ast.STMT_new_port dst_lval) |]
| PEXP_chan pexp_opt -> | Ast.PEXP_chan pexp_opt ->
let (port_stmts, port_opt) = let (port_stmts, port_opt) =
match pexp_opt with match pexp_opt with
None -> ([||], None) None -> ([||], None)
@ -1272,7 +1246,7 @@ and desugar_expr_init
in in
aa port_stmts [| chan_stmt |] aa port_stmts [| chan_stmt |]
| PEXP_box (mutability, arg) -> | Ast.PEXP_box (mutability, arg) ->
let (arg_stmts, arg_mode_atom) = let (arg_stmts, arg_mode_atom) =
desugar_expr_atom ps arg desugar_expr_atom ps arg
in in
@ -1281,7 +1255,7 @@ and desugar_expr_init
in in
aa arg_stmts [| stmt |] aa arg_stmts [| stmt |]
| PEXP_custom (n, a, b) -> | Ast.PEXP_custom (n, a, b) ->
let (arg_stmts, args) = desugar_expr_atoms ps a in let (arg_stmts, args) = desugar_expr_atoms ps a in
let stmts = let stmts =
expand_pexp_custom ps dst_lval n args b ss expand_pexp_custom ps dst_lval n args b ss