Newer
Older

erwan
committed
(* Time-stamp: <modified the 21/06/2017 (at 15:24) by Erwan Jahier> *)
(** Predefined operators Type definition *)
(* XXX shoud not type int, real, and bool be handled there ? *)
type op =
(* zero-ary *)
| TRUE_n
| FALSE_n
| RCONST_n of Lv6Id.t (* we don't want to touch reals! *)
| ICONST_n of Lv6Id.t (* so we don't touch int either...*)
(* unary *)
| NOT_n
| REAL2INT_n
| INT2REAL_n
(* binary *)
| AND_n
| OR_n
| XOR_n
| IMPL_n
| EQ_n
| NEQ_n
| LT_n | LTE_n | GT_n | GTE_n
| ILT_n | ILTE_n| IGT_n| IGTE_n
| RLT_n| RLTE_n| RGT_n| RGTE_n
| DIV_n
| MOD_n
(* ternary *)
| IF_n
(* n-ary *)
| NOR_n
| DIESE_n
(* overloaded operator *)
| UMINUS_n
| MINUS_n
| PLUS_n
| SLASH_n
| TIMES_n
(* un-overloaded operator *)
| IUMINUS_n
| IMINUS_n
| IPLUS_n
| ISLASH_n
| ITIMES_n
| RUMINUS_n
| RMINUS_n
| RPLUS_n
| RSLASH_n
| RTIMES_n
let all_op = [
NOT_n; REAL2INT_n; INT2REAL_n; AND_n; OR_n; XOR_n; IMPL_n;
EQ_n; NEQ_n; LT_n; LTE_n; GT_n; GTE_n;
LT_n; LTE_n; GT_n; GTE_n ;
ILT_n; ILTE_n; IGT_n; IGTE_n ;
DIV_n; MOD_n; IF_n;
NOR_n; DIESE_n; UMINUS_n; MINUS_n; PLUS_n; SLASH_n; TIMES_n;
IUMINUS_n; IMINUS_n; IPLUS_n; ISLASH_n; ITIMES_n; RUMINUS_n;
RMINUS_n; RPLUS_n; RSLASH_n; RTIMES_n
]
Erwan Jahier
committed
(* can occur into an array iterator *)
(* GESTION DES OP PREDEF LAISSE A DESIRER *)
Erwan Jahier
committed
let iterable_op = [
NOT_n; REAL2INT_n; INT2REAL_n; AND_n; OR_n; XOR_n; IMPL_n;
DIV_n; MOD_n; IUMINUS_n; IMINUS_n; IPLUS_n; ISLASH_n; ITIMES_n;
RUMINUS_n; RMINUS_n; RPLUS_n; RSLASH_n; RTIMES_n ;
UMINUS_n; MINUS_n; PLUS_n; SLASH_n; TIMES_n ;
EQ_n; NEQ_n;
LT_n; LTE_n; GT_n; GTE_n ;
ILT_n; ILTE_n; IGT_n; IGTE_n ;
RLT_n; RLTE_n; RGT_n; RGTE_n ;
Erwan Jahier
committed
]
(* iterators? *)
let op2string = function
| TRUE_n -> "true"
| FALSE_n -> "false"
| ICONST_n id -> Lv6Id.to_string id
| RCONST_n id -> Lv6Id.to_string id
| NOT_n -> "not"
| REAL2INT_n -> "real2int"

erwan
committed
| INT2REAL_n -> "int2real"
| AND_n -> "and"
| OR_n -> "or"
| XOR_n -> "xor"
Mamadou Ndiaye
committed
| IMPL_n -> if Lv6MainArgs.global_opt.Lv6MainArgs.kcg then assert false else "=>"
| EQ_n -> "="
| NEQ_n -> "<>"
| LT_n | ILT_n | RLT_n -> "<"
| LTE_n | ILTE_n | RLTE_n -> "<="
| GT_n | IGT_n | RGT_n -> ">"
| GTE_n | IGTE_n | RGTE_n -> ">="
| DIV_n -> "div"
| MOD_n -> "mod"
| IF_n -> "if"
| NOR_n -> "nor"
| DIESE_n -> "#"
| UMINUS_n -> "-"
| MINUS_n -> "-"
| PLUS_n -> "+"
Mamadou Ndiaye
committed
| SLASH_n -> if Lv6MainArgs.global_opt.Lv6MainArgs.kcg then "div" else "/"
| TIMES_n -> "*"
| IUMINUS_n -> "-"
| IMINUS_n -> "-"
| IPLUS_n -> "+"
| ISLASH_n -> "/"
| ITIMES_n -> "*"
| RUMINUS_n -> "-"
| RMINUS_n -> "-"
| RPLUS_n -> "+"
| RSLASH_n -> "/"
| RTIMES_n -> "*"
let op2string_long = function
| EQ_n -> "eq"
| NEQ_n -> "neq"
| LT_n -> "lt"
| ILT_n -> "ilt"
| RLT_n -> "rlt"
| LTE_n -> "lte"
| ILTE_n -> "ilte"
| RLTE_n -> "rlte"
| GT_n -> "gt"
| IGT_n -> "igt"
| RGT_n -> "rgt"
| GTE_n -> "gte"
| IGTE_n -> "igte"
| RGTE_n -> "rgte"
| DIESE_n -> "diese"
| UMINUS_n -> "uminus"
| MINUS_n -> "minus"
| PLUS_n -> "plus"
Erwan Jahier
committed
| SLASH_n -> "slash"
| TIMES_n -> "times"
| IUMINUS_n -> "iuminus"
| IMINUS_n -> "iminus"
| IPLUS_n -> "iplus"
Erwan Jahier
committed
| ISLASH_n -> "islash"
| ITIMES_n -> "itimes"
| RUMINUS_n -> "ruminus"
| RMINUS_n -> "rminus"
| RPLUS_n -> "rplus"
Erwan Jahier
committed
| RSLASH_n -> "rslash"
| RTIMES_n -> "rtimes"
| op -> op2string op
| AND_n | OR_n | XOR_n | IMPL_n | EQ_n | NEQ_n | LT_n | LTE_n | GT_n | GTE_n
| ILT_n | ILTE_n| IGT_n| IGTE_n
| RLT_n| RLTE_n| RGT_n| RGTE_n
| DIV_n
| MOD_n | IF_n | MINUS_n | PLUS_n | SLASH_n | TIMES_n | IMINUS_n | IPLUS_n
| ISLASH_n | ITIMES_n | RMINUS_n | RPLUS_n | RSLASH_n | RTIMES_n
-> true
Erwan Jahier
committed
| IUMINUS_n | UMINUS_n | DIESE_n | NOR_n | INT2REAL_n | REAL2INT_n | NOT_n
| FALSE_n | TRUE_n
-> false
(*********************************************************************************)
let (string_to_op : string -> op) =
function
(* zero-ary *)
| "true" -> TRUE_n
| "false" -> FALSE_n
| "not" -> NOT_n
| "real2int" -> REAL2INT_n
| "int2real" -> INT2REAL_n
| "and" -> AND_n
| "or" -> OR_n
| "xor" -> XOR_n
| "impl" -> IMPL_n
| "eq" -> EQ_n
| "neq" -> NEQ_n
| "lt" -> LT_n
| "ilt" -> ILT_n
| "rlt" -> RLT_n
| "lte" -> LTE_n
| "ilte" -> ILTE_n
| "rlte" -> RLTE_n
| "gt" -> GT_n
| "igt" -> IGT_n
| "rgt" -> RGT_n
| "gte" -> GTE_n
| "igte" -> IGTE_n
| "rgte" -> RGTE_n
| "div" -> DIV_n
| "mod" -> MOD_n
| "if" -> IF_n
| "nor" -> NOR_n
| "#" -> DIESE_n
| "diese" -> DIESE_n
(* overloaded operator *)
| "uminus" -> UMINUS_n
| "minus" -> MINUS_n
| "plus" -> PLUS_n
| "slash" -> SLASH_n
| "times" -> TIMES_n
(* un-overloaded operator *)
| "iuminus" -> IUMINUS_n
| "iminus" -> IMINUS_n
| "iplus" -> IPLUS_n
| "islash" -> ISLASH_n
| "itimes" -> ITIMES_n
| "ruminus" -> RUMINUS_n
| "rminus" -> RMINUS_n
| "rplus" -> RPLUS_n
| "rslash" -> RSLASH_n
| "rtimes" -> RTIMES_n
(* array iterator *)
| "map" -> Map
| "fill" -> Fill
| "red" -> Red
| "boolred" -> BoolRed
| _ -> raise Not_found
let (is_a_predef_op : string -> bool) =
fun str ->
try ignore (string_to_op str); true
with Not_found -> false
(** An evaluator returns a list because Lustre calls returns tuples.
SE: migth raise some check error!
*)
type 'a evaluator = 'a list list -> 'a list
Erwan Jahier
committed
let (op_to_long : op -> Lv6Id.long) =
Erwan Jahier
committed
fun op ->
Lv6Id.make_long
(Lv6Id.pack_name_of_string "Lustre")
(Lv6Id.of_string (op2string_long op))
let (op_to_idref : op -> Lv6Id.idref) =
Lv6Id.make_idref
(Lv6Id.pack_name_of_string "Lustre")
(Lv6Id.of_string (op2string_long op))
Erwan Jahier
committed
(*********************************************************************************)
(* Automatically generate the latex documentation associated to predefined
entities *)
(* let (gen_tex_doc : string -> unit) = *)
(* fun file -> *)
(* let oc = open_out file in *)
(* let p = output_string oc in *)
(* p " Lustre V6 predefined operators \n\n"; *)
(* List.iter (fun (n,def) -> p ("\t" ^ n ^ "\n")) list; *)
(* close_out oc *)
(*********************************************************************************)