Skip to content

Commit 5c82cb4

Browse files
committed
Add Ast.ATOM_pexp and -pexp mode wherein pexps live beyond parsing, into later stages. Fixes to pexp pretty printer.
1 parent 3350b17 commit 5c82cb4

File tree

14 files changed

+66
-12
lines changed

14 files changed

+66
-12
lines changed

src/boot/driver/main.ml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ let (sess:Session.sess) =
2424
Session.sess_out = None;
2525
Session.sess_library_mode = false;
2626
Session.sess_alt_backend = false;
27+
Session.sess_use_pexps = false;
2728
(* FIXME (issue #69): need something fancier here for unix
2829
* sub-flavours.
2930
*)
@@ -214,6 +215,10 @@ let argspecs =
214215
"report dependencies of input, then exit");
215216
("-version", Arg.Unit (fun _ -> print_version()),
216217
"print version information, then exit");
218+
219+
(flag (fun _ -> sess.Session.sess_use_pexps <- true)
220+
"-pexp" "use pexp portion of AST");
221+
217222
] @ (Glue.alt_argspecs sess)
218223
;;
219224

src/boot/driver/session.ml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ type sess =
1313
mutable sess_out: filename option;
1414
mutable sess_library_mode: bool;
1515
mutable sess_alt_backend: bool;
16+
mutable sess_use_pexps: bool;
1617
mutable sess_targ: target;
1718
mutable sess_log_lex: bool;
1819
mutable sess_log_parse: bool;

src/boot/fe/ast.ml

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,7 @@ and port_case =
318318
and atom =
319319
ATOM_literal of (lit identified)
320320
| ATOM_lval of lval
321+
| ATOM_pexp of pexp
321322

322323
and expr =
323324
EXPR_binary of (binop * atom * atom)
@@ -930,6 +931,7 @@ and fmt_pexp (ff:Format.formatter) (pexp:pexp) : unit =
930931
fmt_bracketed_arr_sep "(" ")" "," fmt_opt ff arg_opts
931932

932933
| PEXP_rec (elts, base) ->
934+
fmt_obox_n ff 0;
933935
fmt ff "rec(";
934936
let fmt_elt ff (ident, mut, pexp) =
935937
fmt_mutability ff mut;
@@ -945,6 +947,7 @@ and fmt_pexp (ff:Format.formatter) (pexp:pexp) : unit =
945947
fmt ff " with ";
946948
fmt_pexp ff b
947949
end;
950+
fmt_cbox ff;
948951
fmt ff ")"
949952

950953
| PEXP_tup elts ->
@@ -1014,11 +1017,11 @@ and fmt_pexp (ff:Format.formatter) (pexp:pexp) : unit =
10141017
| PEXP_lit lit ->
10151018
fmt_lit ff lit
10161019

1017-
| PEXP_str str -> fmt_str ff str
1020+
| PEXP_str str -> fmt_str ff ("\"" ^ str ^ "\"")
10181021

10191022
| PEXP_box (mut, pexp) ->
10201023
fmt_mutability ff mut;
1021-
fmt ff "@";
1024+
fmt ff "@@";
10221025
fmt_pexp ff pexp
10231026

10241027
| PEXP_custom (name, args, txt) ->
@@ -1089,6 +1092,7 @@ and fmt_atom (ff:Format.formatter) (a:atom) : unit =
10891092
match a with
10901093
ATOM_literal lit -> fmt_lit ff lit.node
10911094
| ATOM_lval lval -> fmt_lval ff lval
1095+
| ATOM_pexp pexp -> fmt_pexp ff pexp
10921096

10931097
and fmt_atoms (ff:Format.formatter) (az:atom array) : unit =
10941098
fmt ff "(";
@@ -1200,7 +1204,7 @@ and fmt_stmt_body (ff:Format.formatter) (s:stmt) : unit =
12001204
| Some e ->
12011205
begin
12021206
fmt_cbb ff;
1203-
fmt_obox_3 ff;
1207+
fmt_obox_n ff 3;
12041208
fmt ff " else ";
12051209
fmt_obr ff;
12061210
fmt_stmts ff e.node

src/boot/fe/item.ml

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ let empty_view = { Ast.view_imports = Hashtbl.create 0;
1717

1818
let rec parse_expr (ps:pstate) : (Ast.stmt array * Ast.expr) =
1919
let pexp = ctxt "expr" Pexp.parse_pexp ps in
20-
Pexp.desugar_expr ps pexp
20+
if ps.pstate_sess.Session.sess_use_pexps
21+
then ([||], Ast.EXPR_atom (Ast.ATOM_pexp pexp))
22+
else Pexp.desugar_expr ps pexp
2123

2224
and parse_prim_expr (ps:pstate) : Ast.expr =
2325
let pexp = ctxt "expr" Pexp.parse_pexp ps in
@@ -28,7 +30,9 @@ and parse_prim_expr (ps:pstate) : Ast.expr =
2830

2931
and parse_expr_atom (ps:pstate) : (Ast.stmt array * Ast.atom) =
3032
let pexp = ctxt "expr" Pexp.parse_pexp ps in
31-
Pexp.desugar_expr_atom ps pexp
33+
if ps.pstate_sess.Session.sess_use_pexps
34+
then ([||], Ast.ATOM_pexp pexp)
35+
else Pexp.desugar_expr_atom ps pexp
3236

3337
and parse_expr_atom_list
3438
(bra:token)
@@ -39,12 +43,29 @@ and parse_expr_atom_list
3943
(ctxt "expr-atom list" parse_expr_atom) ps)
4044

4145
and parse_expr_init (lv:Ast.lval) (ps:pstate) : (Ast.stmt array) =
46+
let apos = lexpos ps in
4247
let pexp = ctxt "expr" Pexp.parse_pexp ps in
43-
Pexp.desugar_expr_init ps lv pexp
48+
let bpos = lexpos ps in
49+
if ps.pstate_sess.Session.sess_use_pexps
50+
then [|
51+
span ps apos bpos
52+
(Ast.STMT_copy (lv, Ast.EXPR_atom (Ast.ATOM_pexp pexp)))
53+
|]
54+
else Pexp.desugar_expr_init ps lv pexp
4455

4556
and parse_lval (ps:pstate) : (Ast.stmt array * Ast.lval) =
46-
let pexp = Pexp.parse_pexp ps in
47-
Pexp.desugar_lval ps pexp
57+
let apos = lexpos ps in
58+
let pexp = ctxt "lval" Pexp.parse_pexp ps in
59+
let bpos = lexpos ps in
60+
if ps.pstate_sess.Session.sess_use_pexps
61+
then
62+
let (_, tmp, decl_stmt) = build_tmp ps slot_auto apos bpos in
63+
let copy_stmt =
64+
span ps apos bpos
65+
(Ast.STMT_copy (tmp, Ast.EXPR_atom (Ast.ATOM_pexp pexp)))
66+
in
67+
([| decl_stmt; copy_stmt |], (clone_lval ps tmp))
68+
else Pexp.desugar_lval ps pexp
4869

4970
and parse_identified_slot_and_ident
5071
(aliases_ok:bool)

src/boot/fe/parser.ml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ let clone_atom (ps:pstate) (atom:Ast.atom) : Ast.atom =
164164
match atom with
165165
Ast.ATOM_literal _ -> atom
166166
| Ast.ATOM_lval lv -> Ast.ATOM_lval (clone_lval ps lv)
167+
| Ast.ATOM_pexp _ -> bug () "Parser.clone_atom on ATOM_pexp"
167168
;;
168169

169170
let ctxt (n:string) (f:pstate -> 'a) (ps:pstate) : 'a =

src/boot/fe/pexp.ml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1263,10 +1263,11 @@ and desugar_expr_init
12631263
aa arg_stmts stmts
12641264

12651265

1266-
and atom_lval (ps:pstate) (at:Ast.atom) : Ast.lval =
1266+
and atom_lval (_:pstate) (at:Ast.atom) : Ast.lval =
12671267
match at with
12681268
Ast.ATOM_lval lv -> lv
1269-
| Ast.ATOM_literal _ -> raise (err "literal where lval expected" ps)
1269+
| Ast.ATOM_literal _
1270+
| Ast.ATOM_pexp _ -> bug () "Pexp.atom_lval on non-ATOM_lval"
12701271
;;
12711272

12721273

src/boot/llvm/lltrans.ml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -817,6 +817,8 @@ let trans_crate
817817
| Ast.ATOM_lval lval ->
818818
Llvm.build_load (fst (trans_lval lval)) (anon_llid "tmp")
819819
llbuilder
820+
| Ast.ATOM_pexp _ ->
821+
bug () "Lltrans.trans_atom on ATOM_pexp"
820822
in
821823

822824
let build_binop (op:Ast.binop) (lllhs:Llvm.llvalue) (llrhs:Llvm.llvalue)

src/boot/me/resolve.ml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -495,6 +495,9 @@ let type_resolving_visitor
495495
| Ast.COMP_atom (Ast.ATOM_literal _) -> ext
496496
| Ast.COMP_atom (Ast.ATOM_lval lv) ->
497497
Ast.COMP_atom (Ast.ATOM_lval (rebuild_lval lv))
498+
| Ast.COMP_atom (Ast.ATOM_pexp _) ->
499+
bug () "Resolve.rebuild_lval' on ATOM_pexp"
500+
498501
| Ast.COMP_named (Ast.COMP_app (ident, params)) ->
499502
Ast.COMP_named
500503
(Ast.COMP_app (ident, Array.map resolve_ty params))

src/boot/me/semant.ml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1326,6 +1326,7 @@ let rec atom_type (cx:ctxt) (at:Ast.atom) : Ast.ty =
13261326
| Ast.ATOM_literal {node=(Ast.LIT_nil); id=_} -> Ast.TY_nil
13271327
| Ast.ATOM_literal {node=(Ast.LIT_mach_int (m,_)); id=_} -> Ast.TY_mach m
13281328
| Ast.ATOM_lval lv -> lval_ty cx lv
1329+
| Ast.ATOM_pexp _ -> bug () "Semant.atom_type on ATOM_pexp"
13291330
;;
13301331

13311332
let expr_type (cx:ctxt) (e:Ast.expr) : Ast.ty =

src/boot/me/trans.ml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1031,6 +1031,9 @@ let trans_visitor
10311031
| Ast.ATOM_lval lv ->
10321032
trans_const_lval lv
10331033

1034+
| Ast.ATOM_pexp _ ->
1035+
unimpl None "constant-folding pexp atom"
1036+
10341037
and trans_const_expr
10351038
(expr:Ast.expr)
10361039
: (Ast.ty * const) =
@@ -1404,6 +1407,8 @@ let trans_visitor
14041407
Il.Cell (fst (deref_ty DEREF_none false cell ty))
14051408

14061409
| Ast.ATOM_literal lit -> trans_lit lit.node
1410+
| Ast.ATOM_pexp _ -> bug () "Trans.trans_atom on ATOM_pexp"
1411+
14071412

14081413
and fixup_to_ptr_operand
14091414
(imm_ok:bool)
@@ -3583,6 +3588,10 @@ let trans_visitor
35833588
dst_cell dst_ty
35843589
src_cell src_ty
35853590

3591+
| (_, Ast.EXPR_atom (Ast.ATOM_pexp _)) ->
3592+
bug () "Trans.trans_copy on ATOM_pexp"
3593+
3594+
35863595
and trans_init_direct_fn
35873596
(dst_cell:Il.cell)
35883597
(flv:Ast.lval)

src/boot/me/type.ml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -624,6 +624,7 @@ let check_stmt (cx:Semant.ctxt) : (fn_ctx -> Ast.stmt -> unit) =
624624
match atom with
625625
Ast.ATOM_lval lval -> check_lval ~deref:deref lval
626626
| Ast.ATOM_literal lit_id -> check_literal lit_id.Common.node
627+
| Ast.ATOM_pexp _ -> Common.bug () "Type.check_atom on ATOM_pexp"
627628
in
628629

629630
let infer_slot (ty:Ast.ty) (slot_id:Common.node_id) : unit =

src/boot/me/typestate.ml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,7 @@ and atom_slots (cx:ctxt) (a:Ast.atom) : node_id array =
258258
match a with
259259
Ast.ATOM_literal _ -> [| |]
260260
| Ast.ATOM_lval lv -> lval_slots cx lv
261+
| Ast.ATOM_pexp _ -> bug () "Typestate.atom_slots on ATOM_pexp"
261262
;;
262263

263264
let lval_option_slots (cx:ctxt) (lv:Ast.lval option) : node_id array =

src/boot/me/walk.ml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -557,6 +557,7 @@ and walk_atom
557557
match a with
558558
Ast.ATOM_literal ls -> walk_lit v ls.node
559559
| Ast.ATOM_lval lv -> walk_lval v lv
560+
| Ast.ATOM_pexp _ -> bug () "Walk.walk_atom on ATOM_pexp"
560561

561562

562563
and walk_opt_atom

src/boot/util/fmt.ml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,12 @@ let fmt_str ff = fmt ff "%s"
99
;;
1010

1111
let fmt_obox ff = Format.pp_open_box ff 4;;
12-
let fmt_obox_3 ff = Format.pp_open_box ff 3;;
12+
let fmt_obox_n ff n = Format.pp_open_box ff n;;
1313
let fmt_cbox ff = Format.pp_close_box ff ();;
1414
let fmt_obr ff = fmt ff "{";;
1515
let fmt_cbr ff = fmt ff "@\n}";;
1616
let fmt_cbb ff = (fmt_cbox ff; fmt_cbr ff);;
17+
let fmt_break ff = Format.pp_print_space ff ();;
1718

1819
let fmt_bracketed
1920
(bra:string)
@@ -23,7 +24,9 @@ let fmt_bracketed
2324
(a:'a)
2425
: unit =
2526
fmt_str ff bra;
27+
fmt_obox_n ff 0;
2628
inner ff a;
29+
fmt_cbox ff;
2730
fmt_str ff ket
2831
;;
2932

@@ -37,7 +40,7 @@ let fmt_arr_sep
3740
begin
3841
fun i a ->
3942
if i <> 0
40-
then fmt_str ff sep;
43+
then (fmt_str ff sep; fmt_break ff);
4144
inner ff a
4245
end
4346
az

0 commit comments

Comments
 (0)