add srcloc in mini-c
This commit is contained in:
parent
2db55ae965
commit
551bf176fe
@ -234,7 +234,7 @@ let transpile_constant' : AST.constant' -> constant' = function
|
|||||||
| C_CONVERT_FROM_RIGHT_COMB -> C_CONVERT_FROM_RIGHT_COMB
|
| C_CONVERT_FROM_RIGHT_COMB -> C_CONVERT_FROM_RIGHT_COMB
|
||||||
|
|
||||||
let rec transpile_type (t:AST.type_expression) : type_expression result =
|
let rec transpile_type (t:AST.type_expression) : type_expression result =
|
||||||
let return tc = ok @@ Expression.make_t @@ tc in
|
let return tc = ok @@ Expression.make_t ~loc:t.location @@ tc in
|
||||||
match t.type_content with
|
match t.type_content with
|
||||||
| T_variable (name) when Var.equal name Stage_common.Constant.t_bool -> return (T_base TB_bool)
|
| T_variable (name) when Var.equal name Stage_common.Constant.t_bool -> return (T_base TB_bool)
|
||||||
| t when (compare t (t_bool ()).type_content) = 0-> return (T_base TB_bool)
|
| t when (compare t (t_bool ()).type_content) = 0-> return (T_base TB_bool)
|
||||||
@ -392,7 +392,7 @@ and tree_of_sum : AST.type_expression -> (AST.constructor' * AST.type_expression
|
|||||||
|
|
||||||
and transpile_annotated_expression (ae:AST.expression) : expression result =
|
and transpile_annotated_expression (ae:AST.expression) : expression result =
|
||||||
let%bind tv = transpile_type ae.type_expression in
|
let%bind tv = transpile_type ae.type_expression in
|
||||||
let return ?(tv = tv) expr = ok @@ Combinators.Expression.make_tpl (expr, tv) in
|
let return ?(tv = tv) expr = ok @@ Combinators.Expression.make_tpl ~loc:ae.location (expr, tv) in
|
||||||
let info =
|
let info =
|
||||||
let title () = "translating expression" in
|
let title () = "translating expression" in
|
||||||
let content () = Format.asprintf "%a" Location.pp ae.location in
|
let content () = Format.asprintf "%a" Location.pp ae.location in
|
||||||
@ -474,10 +474,12 @@ and transpile_annotated_expression (ae:AST.expression) : expression result =
|
|||||||
let aux = fun pred (ty, lr) ->
|
let aux = fun pred (ty, lr) ->
|
||||||
let c = match lr with
|
let c = match lr with
|
||||||
| `Left -> C_CAR
|
| `Left -> C_CAR
|
||||||
| `Right -> C_CDR in
|
| `Right -> C_CDR
|
||||||
Combinators.Expression.make_tpl (E_constant {cons_name=c;arguments=[pred]} , ty) in
|
in
|
||||||
|
return ~tv:ty @@ E_constant {cons_name=c;arguments=[pred]}
|
||||||
|
in
|
||||||
let%bind record' = transpile_annotated_expression record in
|
let%bind record' = transpile_annotated_expression record in
|
||||||
let expr = List.fold_left aux record' path in
|
let%bind expr = bind_fold_list aux record' path in
|
||||||
ok expr
|
ok expr
|
||||||
| E_record_update {record; path; update} ->
|
| E_record_update {record; path; update} ->
|
||||||
let rec aux res (r,p,up) =
|
let rec aux res (r,p,up) =
|
||||||
@ -654,14 +656,14 @@ and transpile_lambda l (input_type , output_type) =
|
|||||||
let tv = Combinators.t_function input output in
|
let tv = Combinators.t_function input output in
|
||||||
let binder = binder in
|
let binder = binder in
|
||||||
let closure = E_closure { binder; body = result'} in
|
let closure = E_closure { binder; body = result'} in
|
||||||
ok @@ Combinators.Expression.make_tpl (closure , tv)
|
ok @@ Combinators.Expression.make_tpl ~loc:result.location (closure , tv)
|
||||||
|
|
||||||
and transpile_recursive {fun_name; fun_type; lambda} =
|
and transpile_recursive {fun_name; fun_type; lambda} =
|
||||||
let rec map_lambda : AST.expression_variable -> type_expression -> AST.expression -> (expression * expression_variable list) result = fun fun_name loop_type e ->
|
let rec map_lambda : AST.expression_variable -> type_expression -> AST.expression -> (expression * expression_variable list) result = fun fun_name loop_type e ->
|
||||||
match e.expression_content with
|
match e.expression_content with
|
||||||
E_lambda {binder;result} ->
|
E_lambda {binder;result} ->
|
||||||
let%bind (body,l) = map_lambda fun_name loop_type result in
|
let%bind (body,l) = map_lambda fun_name loop_type result in
|
||||||
ok @@ (Expression.make (E_closure {binder;body}) loop_type, binder::l)
|
ok @@ (Expression.make ~loc:e.location (E_closure {binder;body}) loop_type, binder::l)
|
||||||
| _ ->
|
| _ ->
|
||||||
let%bind res = replace_callback fun_name loop_type false e in
|
let%bind res = replace_callback fun_name loop_type false e in
|
||||||
ok @@ (res, [])
|
ok @@ (res, [])
|
||||||
|
@ -259,8 +259,8 @@ let%expect_test _ =
|
|||||||
|
|
||||||
let%expect_test _ =
|
let%expect_test _ =
|
||||||
let pp = expression_content Format.std_formatter in
|
let pp = expression_content Format.std_formatter in
|
||||||
let dummy_type = {type_content=T_base TB_unit} in
|
let dummy_type = {type_content=T_base TB_unit;location=Location.generated} in
|
||||||
let wrap e = { content = e ; type_expression = dummy_type} in
|
let wrap e = { content = e ; type_expression = dummy_type ; location = Location.generated} in
|
||||||
pp @@ E_closure { binder = Var.of_name "y" ; body = wrap (E_variable (Var.of_name "y")) } ;
|
pp @@ E_closure { binder = Var.of_name "y" ; body = wrap (E_variable (Var.of_name "y")) } ;
|
||||||
[%expect{|
|
[%expect{|
|
||||||
fun y -> (y)
|
fun y -> (y)
|
||||||
|
@ -8,18 +8,21 @@ module Expression = struct
|
|||||||
let get_content : t -> t' = fun e -> e.content
|
let get_content : t -> t' = fun e -> e.content
|
||||||
let get_type : t -> type_expression = fun e -> e.type_expression
|
let get_type : t -> type_expression = fun e -> e.type_expression
|
||||||
|
|
||||||
let make_t = fun tc -> {
|
let make_t ?(loc=Location.generated) = fun tc -> {
|
||||||
type_content = tc;
|
type_content = tc;
|
||||||
|
location = loc;
|
||||||
}
|
}
|
||||||
|
|
||||||
let make = fun e' t -> {
|
let make ?(loc=Location.generated) = fun e' t -> {
|
||||||
content = e' ;
|
content = e' ;
|
||||||
type_expression = t ;
|
type_expression = t ;
|
||||||
|
location = loc;
|
||||||
}
|
}
|
||||||
|
|
||||||
let make_tpl = fun (e' , t) -> {
|
let make_tpl ?(loc=Location.generated) = fun (e' , t) -> {
|
||||||
content = e' ;
|
content = e' ;
|
||||||
type_expression = t ;
|
type_expression = t ;
|
||||||
|
location = loc;
|
||||||
}
|
}
|
||||||
|
|
||||||
let pair : t -> t -> t' = fun a b -> E_constant { cons_name = C_PAIR; arguments = [ a ; b ]}
|
let pair : t -> t -> t' = fun a b -> E_constant { cons_name = C_PAIR; arguments = [ a ; b ]}
|
||||||
@ -164,24 +167,24 @@ let get_operation (v:value) = match v with
|
|||||||
| _ -> simple_fail "not an operation"
|
| _ -> simple_fail "not an operation"
|
||||||
|
|
||||||
|
|
||||||
let t_int () : type_expression = Expression.make_t @@ T_base TB_int
|
let t_int ?loc () : type_expression = Expression.make_t ?loc @@ T_base TB_int
|
||||||
let t_unit () : type_expression = Expression.make_t @@ T_base TB_unit
|
let t_unit ?loc () : type_expression = Expression.make_t ?loc @@ T_base TB_unit
|
||||||
let t_nat () : type_expression = Expression.make_t @@ T_base TB_nat
|
let t_nat ?loc () : type_expression = Expression.make_t ?loc @@ T_base TB_nat
|
||||||
|
|
||||||
let t_function x y : type_expression = Expression.make_t @@ T_function ( x , y )
|
let t_function ?loc x y : type_expression = Expression.make_t ?loc @@ T_function ( x , y )
|
||||||
let t_pair x y : type_expression = Expression.make_t @@ T_pair ( x , y )
|
let t_pair ?loc x y : type_expression = Expression.make_t ?loc @@ T_pair ( x , y )
|
||||||
let t_union x y : type_expression = Expression.make_t @@ T_or ( x , y )
|
let t_union ?loc x y : type_expression = Expression.make_t ?loc @@ T_or ( x , y )
|
||||||
|
|
||||||
let e_int expr : expression = Expression.make_tpl (expr, t_int ())
|
let e_int ?loc expr : expression = Expression.make_tpl ?loc (expr, t_int ())
|
||||||
let e_unit : expression = Expression.make_tpl (E_literal D_unit, t_unit ())
|
let e_unit ?loc () : expression = Expression.make_tpl ?loc (E_literal D_unit, t_unit ())
|
||||||
let e_skip : expression = Expression.make_tpl (E_skip, t_unit ())
|
let e_skip ?loc () : expression = Expression.make_tpl ?loc (E_skip, t_unit ())
|
||||||
let e_var_int name : expression = e_int (E_variable name)
|
let e_var_int ?loc name : expression = e_int ?loc (E_variable name)
|
||||||
let e_let_in v tv inline expr body : expression = Expression.(make_tpl (
|
let e_let_in ?loc v tv inline expr body : expression = Expression.(make_tpl ?loc(
|
||||||
E_let_in ((v , tv) , inline, expr , body) ,
|
E_let_in ((v , tv) , inline, expr , body) ,
|
||||||
get_type body
|
get_type body
|
||||||
))
|
))
|
||||||
|
|
||||||
let ez_e_sequence a b : expression = Expression.(make_tpl (E_sequence (make_tpl (a , t_unit ()) , b) , get_type b))
|
let ez_e_sequence ?loc a b : expression = Expression.(make_tpl (E_sequence (make_tpl ?loc (a , t_unit ()) , b) , get_type b))
|
||||||
|
|
||||||
let d_unit : value = D_unit
|
let d_unit : value = D_unit
|
||||||
|
|
||||||
|
@ -10,9 +10,9 @@ module Expression : sig
|
|||||||
(*
|
(*
|
||||||
val is_toplevel : t -> bool
|
val is_toplevel : t -> bool
|
||||||
*)
|
*)
|
||||||
val make_t : type_content -> type_expression
|
val make_t : ?loc:Location.t -> type_content -> type_expression
|
||||||
val make : t' -> type_expression -> t
|
val make : ?loc:Location.t -> t' -> type_expression -> t
|
||||||
val make_tpl : t' * type_expression -> t
|
val make_tpl : ?loc:Location.t -> t' * type_expression -> t
|
||||||
|
|
||||||
val pair : t -> t -> t'
|
val pair : t -> t -> t'
|
||||||
end
|
end
|
||||||
@ -53,24 +53,24 @@ val get_t_contract : type_expression -> type_expression result
|
|||||||
val get_t_operation : type_expression -> type_expression result
|
val get_t_operation : type_expression -> type_expression result
|
||||||
val get_operation : value -> Memory_proto_alpha.Protocol.Alpha_context.packed_internal_operation result
|
val get_operation : value -> Memory_proto_alpha.Protocol.Alpha_context.packed_internal_operation result
|
||||||
|
|
||||||
val t_int : unit -> type_expression
|
val t_int : ?loc:Location.t -> unit -> type_expression
|
||||||
val t_unit : unit -> type_expression
|
val t_unit : ?loc:Location.t -> unit -> type_expression
|
||||||
val t_nat : unit -> type_expression
|
val t_nat : ?loc:Location.t -> unit -> type_expression
|
||||||
val t_function : type_expression -> type_expression -> type_expression
|
val t_function : ?loc:Location.t -> type_expression -> type_expression -> type_expression
|
||||||
val t_pair : type_expression annotated -> type_expression annotated -> type_expression
|
val t_pair : ?loc:Location.t -> type_expression annotated -> type_expression annotated -> type_expression
|
||||||
val t_union : type_expression annotated -> type_expression annotated -> type_expression
|
val t_union : ?loc:Location.t -> type_expression annotated -> type_expression annotated -> type_expression
|
||||||
(*
|
(*
|
||||||
val quote : string -> type_value -> type_value -> Expression.t -> anon_function
|
val quote : string -> type_value -> type_value -> Expression.t -> anon_function
|
||||||
|
|
||||||
|
|
||||||
val e_int : Expression.t' -> Expression.t
|
val e_int : Expression.t' -> Expression.t
|
||||||
*)
|
*)
|
||||||
val e_unit : Expression.t
|
val e_unit : ?loc:Location.t -> unit -> Expression.t
|
||||||
val e_skip : Expression.t
|
val e_skip : ?loc:Location.t -> unit -> Expression.t
|
||||||
val e_var_int : expression_variable -> Expression.t
|
val e_var_int : ?loc:Location.t -> expression_variable -> Expression.t
|
||||||
val e_let_in : expression_variable -> type_expression -> inline -> Expression.t -> Expression.t -> Expression.t
|
val e_let_in : ?loc:Location.t -> expression_variable -> type_expression -> inline -> Expression.t -> Expression.t -> Expression.t
|
||||||
|
|
||||||
val ez_e_sequence : Expression.t' -> Expression.t -> expression
|
val ez_e_sequence : ?loc:Location.t -> Expression.t' -> Expression.t -> expression
|
||||||
(*
|
(*
|
||||||
val ez_e_return : Expression.t -> Expression.t
|
val ez_e_return : Expression.t -> Expression.t
|
||||||
*)
|
*)
|
||||||
|
@ -155,6 +155,7 @@ let aggregate_entry (lst : program) (form : form_t) : expression result =
|
|||||||
let e' = {
|
let e' = {
|
||||||
content = E_closure l' ;
|
content = E_closure l' ;
|
||||||
type_expression = entry_expression.type_expression ;
|
type_expression = entry_expression.type_expression ;
|
||||||
|
location = entry_expression.location;
|
||||||
} in
|
} in
|
||||||
ok e'
|
ok e'
|
||||||
)
|
)
|
||||||
|
@ -16,6 +16,7 @@ type type_content =
|
|||||||
|
|
||||||
and type_expression = {
|
and type_expression = {
|
||||||
type_content : type_content;
|
type_content : type_content;
|
||||||
|
location : Location.t;
|
||||||
}
|
}
|
||||||
|
|
||||||
and type_base =
|
and type_base =
|
||||||
@ -94,6 +95,7 @@ and expression_content =
|
|||||||
and expression = {
|
and expression = {
|
||||||
content : expression_content ;
|
content : expression_content ;
|
||||||
type_expression : type_expression ;
|
type_expression : type_expression ;
|
||||||
|
location : Location.t;
|
||||||
}
|
}
|
||||||
|
|
||||||
and constant = {
|
and constant = {
|
||||||
|
Loading…
Reference in New Issue
Block a user