From 04396cc7fee4e5c5c5154fef675f21bf6622672f Mon Sep 17 00:00:00 2001
From: Christophe Garion <tofgarion@runbox.com>
Date: Mon, 2 Oct 2017 17:55:24 +0200
Subject: [PATCH] parser-json: add variables in parsing

---
 src/lustreSpec.ml                             |  31 +-
 src/tools/stateflow/main_with_json.ml         |   4 +-
 .../stateflow/parser-json/parser_json.ml      | 277 ++++++++++--------
 3 files changed, 168 insertions(+), 144 deletions(-)

diff --git a/src/lustreSpec.ml b/src/lustreSpec.ml
index 3051b4d0..096fe9fc 100644
--- a/src/lustreSpec.ml
+++ b/src/lustreSpec.ml
@@ -43,10 +43,11 @@ type clock_dec =
 
 and clock_dec_desc =
   | Ckdec_any
-  | Ckdec_bool of (ident * ident) list 
+  | Ckdec_bool of (ident * ident) list
 
 
 type constant =
+  | Const_bool of bool
   | Const_int of int
   | Const_real of Num.num * int * string (* (a, b, c) means a * 10^-b. c is the original string *)
   | Const_array of constant list
@@ -56,7 +57,7 @@ type constant =
 
 type quantifier_type = Exists | Forall
 
-type var_decl = 
+type var_decl =
     {var_id: ident;
      var_orig:bool;
      var_dec_type: type_dec;
@@ -100,7 +101,7 @@ and expr_desc =
   | Expr_merge of ident * (label * expr) list
   | Expr_appl of call_t
 
-and call_t = ident * expr * expr option 
+and call_t = ident * expr * expr option
      (* The third part denotes the boolean condition for resetting *)
 
 and eq =
@@ -134,7 +135,7 @@ type offset =
 | Index of Dimension.dim_expr
 | Field of label
 
-type assert_t = 
+type assert_t =
     {
       assert_expr: expr;
       assert_loc: Location.t;
@@ -168,7 +169,7 @@ type node_desc =
      node_locals: var_decl list;
      mutable node_gencalls: expr list;
      mutable node_checks: Dimension.dim_expr list;
-     node_asserts: assert_t list; 
+     node_asserts: assert_t list;
      node_stmts: statement list;
      mutable node_dec_stateless: bool;
      mutable node_stateless: bool option;
@@ -188,10 +189,10 @@ type imported_node_desc =
      nodei_in_lib: string list;
     }
 
-type const_desc = 
-    {const_id: ident; 
-     const_loc: Location.t; 
-     const_value: constant;      
+type const_desc =
+    {const_id: ident;
+     const_loc: Location.t;
+     const_value: constant;
      mutable const_type: Types.type_expr;
     }
 
@@ -199,7 +200,7 @@ type top_decl_desc =
 | Node of node_desc
 | Const of const_desc
 | ImportedNode of imported_node_desc
-| Open of bool * string (* the boolean set to true denotes a local 
+| Open of bool * string (* the boolean set to true denotes a local
 			   lusi vs a lusi installed at system level *)
 | TypeDef of typedef_desc
 
@@ -211,16 +212,16 @@ type top_decl =
 
 type program = top_decl list
 
-type dep_t = Dep of 
-    bool 
+type dep_t = Dep of
+    bool
   * ident
-  * (top_decl list) 
+  * (top_decl list)
   * bool (* is stateful *)
 
 
 (************ Machine code types *************)
 
-type value_t = 
+type value_t =
   {
     value_desc: value_t_desc;
     value_type: Types.type_expr;
@@ -230,7 +231,7 @@ and value_t_desc =
   | Cst of constant
   | LocalVar of var_decl
   | StateVar of var_decl
-  | Fun of ident * value_t list 
+  | Fun of ident * value_t list
   | Array of value_t list
   | Access of value_t * value_t
   | Power of value_t * value_t
diff --git a/src/tools/stateflow/main_with_json.ml b/src/tools/stateflow/main_with_json.ml
index 9de4efc9..27c88c9a 100644
--- a/src/tools/stateflow/main_with_json.ml
+++ b/src/tools/stateflow/main_with_json.ml
@@ -23,7 +23,7 @@ struct
   let json                       = Yojson.Basic.from_file "GPCA_Alarm_Alarm_SFIR_pp.json"
   let Program (init, defs, vars) = Parse.parse_prog json
   let prog                       = Parse.parse_prog json
-  let user_vars                  = Parse.parse_variables json
+  (* let user_vars                  = Parse.parse_variables json *)
   (*let _ = Format.printf "Model definitions@.%a@.####" Simulink.pp_src defs; ()*)
 end
 
@@ -55,7 +55,7 @@ module EvalProg = Interp.Evaluation (Thetaify) (Prog)
 let main ()  =
   begin
     SF.pp_prog Format.std_formatter (Parse.parse_prog Prog.json);
-    SF.pp_vars Format.std_formatter (Parse.parse_variables Prog.json);
+    (* SF.pp_vars Format.std_formatter (Parse.parse_variables Prog.json); *)
   end
 
 let _ = main ()
diff --git a/src/tools/stateflow/parser-json/parser_json.ml b/src/tools/stateflow/parser-json/parser_json.ml
index 75e8d43e..8b580235 100644
--- a/src/tools/stateflow/parser-json/parser_json.ml
+++ b/src/tools/stateflow/parser-json/parser_json.ml
@@ -1,127 +1,150 @@
-open Yojson
-open Datatype
-(* open Simulink *)
-(* open Transformer *)
-open Basetypes
-open Basic
-open CPS
-
-module type ParseExt =
-sig
-  val parse_condition : json -> Condition.t
-  val parse_action : json -> Action.t
-  val parse_event : json -> Basetypes.event_t
-end
-
-module Parser (Ext : ParseExt) =
-struct
-  let path_split = String.split_on_char '/'
-  let path_concat = String.concat (String.make 1 '/')
-
-  open Util
-
-  let to_list json =
-    try
-      json |> to_list
-    with
-      Type_error _ -> [ json ]
-
-  let rec parse_prog json : prog_t =
-     (*Format.printf "parse_prog@.";*)
-    Program (
-      json |> member "name"        |> to_string,
-     (json |> member "states"      |> to_list |> List.map parse_state) @
-     (json |> member "junctions"   |> to_list |> List.map parse_junction)
-     @
-     (json |> member "sffunctions" |> to_list |> List.map
-        (fun res -> SFFunction (parse_prog res))),
-      [] (* TODO: to be replaced by variables ! *)
-    )
-  and parse_variables json =
-     (*Format.printf "parse_variables@.";*)
-    json |> member "data"       |> to_list |> List.map parse_variable
-  and parse_state json =
-    (*Format.printf "parse_state@.";*)
-    State (
-      json |> member "path" |> parse_path,
-      json |> parse_state_def
-    )
-  and parse_path json =
-      (*Format.printf "parse_path@.";*)
-      json |> to_string |> path_split
-  and parse_state_def json =
-    (*Format.printf "parse_state_def@.";*)
-    {
-      state_actions        = json |> member "state_actions"        |> parse_state_actions;
-      outer_trans          = json |> member "outer_trans"          |> to_list |> List.map parse_transition;
-      inner_trans          = json |> member "inner_trans"          |> to_list |> List.map parse_transition;
-      internal_composition = json |> member "internal_composition" |> parse_internal_composition
-    }
-  and parse_state_actions json =
-    (*Format.printf "parse_state_actions@.";*)
-    {
-      entry_act  = json |> member "entry_act"  |> Ext.parse_action;
-      during_act = json |> member "during_act" |> Ext.parse_action;
-      exit_act   = json |> member "exit_act"   |> Ext.parse_action;
-    }
-  and parse_transition json =
-    (*Format.printf "parse_transition@.";*)
-    {
-      event          = json |> member "event"          |> Ext.parse_event;
-      condition      = json |> member "condition"      |> Ext.parse_condition;
-      condition_act  = json |> member "condition_act"  |> Ext.parse_action;
-      transition_act = json |> member "transition_act" |> Ext.parse_action;
-      dest           = json |> member "dest"           |> parse_dest
-    }
-  and parse_dest json =
-    (*Format.printf "parse_dest@.";*)
-    (json |> member "type" |> to_string |>
-	(function
-	| "State"    -> (fun p -> DPath p)
-	| "Junction" -> (fun j -> DJunction (path_concat j))
-	| _ -> assert false))
-      (json |> member "name" |> parse_path)
-  and parse_internal_composition json =
-    (*Format.printf "parse_internal_composition@.";*)
-    (json |> member "type" |> to_string |>
-	(function
-	| "EXCLUSIVE_OR" -> (fun tinit substates ->                      Or  (tinit, substates))
-	| "PARALLEL_AND" -> (fun tinit substates -> assert (tinit = []); And (substates))
-	| _ -> assert false))
-      (json |> member "tinit"     |> parse_tinit)
-      (json |> member "substates" |> to_list |> List.map to_string)
-  and parse_tinit json =
-    (*Format.printf "parse_tinit@.";*)
-    json |> to_list |> List.map parse_transition
-  and parse_junction json =
-    (*Format.printf "parse_junction@.";*)
-    Junction (
-      json |> member "path"        |> to_string,
-      json |> member "outer_trans" |> to_list |> List.map parse_transition
-    )
-  and scope_of_string s =
-    match s with
-    | "Constant"  -> Constant
-    | "Input"     -> Input
-    | "Local"     -> Local
-    | "Output"    -> Output
-    | "Parameter" -> Parameter
-    | _           -> failwith ("Invalid scope for variable: " ^ s)
-  and datatype_of_json json =
-    let datatype = json |> member "datatype" |> to_string in
-    let init_value = json |> member "initial_value" |> to_string in
-    match datatype with
-    | "bool" -> Bool (bool_of_string init_value)
-    | "int"  -> Int  (int_of_string init_value)
-    | "real" -> Real (float_of_string init_value)
-    | _      -> failwith ("Invalid datatype " ^ datatype
-                          ^ " for variable " ^ (json |> member "name"
-                                                |> to_string))
-  and parse_variable json =
-    (*Format.printf "parse_variables@.";*)
-    (
-      json |> member "name"          |> to_string,
-      json |> member "scope"         |> to_string |> scope_of_string,
-      json                           |> datatype_of_json
-    )
-end
+open Yojson
+open Datatype
+(* open Simulink *)
+(* open Transformer *)
+open Basetypes
+open Basic
+open Corelang
+open CPS
+open LustreSpec
+
+module type ParseExt =
+sig
+  val parse_condition : json -> Condition.t
+  val parse_action : json -> Action.t
+  val parse_event : json -> Basetypes.event_t
+end
+
+module Parser (Ext : ParseExt) =
+struct
+  let path_split = String.split_on_char '/'
+  let path_concat = String.concat (String.make 1 '/')
+
+  open Util
+
+  let to_list json =
+    try
+      json |> to_list
+    with
+      Type_error _ -> [ json ]
+
+  let rec parse_prog json : prog_t =
+     (*Format.printf "parse_prog@.";*)
+    Program (
+      json |> member "name"        |> to_string,
+     (json |> member "states"      |> to_list |> List.map parse_state) @
+     (json |> member "junctions"   |> to_list |> List.map parse_junction)
+     @
+     (json |> member "sffunctions" |> to_list |> List.map
+        (fun res -> SFFunction (parse_prog res))),
+      json |> member "data"        |> to_list |> List.map parse_variable
+    )
+  (* and parse_variables json = *)
+  (*    (\*Format.printf "parse_variables@.";*\) *)
+  (*   json |> member "data"       |> to_list |> List.map parse_variable *)
+  and parse_state json =
+    (*Format.printf "parse_state@.";*)
+    State (
+      json |> member "path" |> parse_path,
+      json |> parse_state_def
+    )
+  and parse_path json =
+      (*Format.printf "parse_path@.";*)
+      json |> to_string |> path_split
+  and parse_state_def json =
+    (*Format.printf "parse_state_def@.";*)
+    {
+      state_actions        = json |> member "state_actions"        |> parse_state_actions;
+      outer_trans          = json |> member "outer_trans"          |> to_list |> List.map parse_transition;
+      inner_trans          = json |> member "inner_trans"          |> to_list |> List.map parse_transition;
+      internal_composition = json |> member "internal_composition" |> parse_internal_composition
+    }
+  and parse_state_actions json =
+    (*Format.printf "parse_state_actions@.";*)
+    {
+      entry_act  = json |> member "entry_act"  |> Ext.parse_action;
+      during_act = json |> member "during_act" |> Ext.parse_action;
+      exit_act   = json |> member "exit_act"   |> Ext.parse_action;
+    }
+  and parse_transition json =
+    (*Format.printf "parse_transition@.";*)
+    {
+      event          = json |> member "event"          |> Ext.parse_event;
+      condition      = json |> member "condition"      |> Ext.parse_condition;
+      condition_act  = json |> member "condition_act"  |> Ext.parse_action;
+      transition_act = json |> member "transition_act" |> Ext.parse_action;
+      dest           = json |> member "dest"           |> parse_dest
+    }
+  and parse_dest json =
+    (*Format.printf "parse_dest@.";*)
+    (json |> member "type" |> to_string |>
+	(function
+	| "State"    -> (fun p -> DPath p)
+	| "Junction" -> (fun j -> DJunction (path_concat j))
+	| _ -> assert false))
+      (json |> member "name" |> parse_path)
+  and parse_internal_composition json =
+    (*Format.printf "parse_internal_composition@.";*)
+    (json |> member "type" |> to_string |>
+	(function
+	| "EXCLUSIVE_OR" -> (fun tinit substates ->                      Or  (tinit, substates))
+	| "PARALLEL_AND" -> (fun tinit substates -> assert (tinit = []); And (substates))
+	| _ -> assert false))
+      (json |> member "tinit"     |> parse_tinit)
+      (json |> member "substates" |> to_list |> List.map to_string)
+  and parse_tinit json =
+    (*Format.printf "parse_tinit@.";*)
+    json |> to_list |> List.map parse_transition
+  and parse_junction json =
+    (*Format.printf "parse_junction@.";*)
+    Junction (
+      json |> member "path"        |> to_string,
+      json |> member "outer_trans" |> to_list |> List.map parse_transition
+    )
+  and scope_of_string s =
+    match s with
+    | "Constant"  -> Constant
+    | "Input"     -> Input
+    | "Local"     -> Local
+    | "Output"    -> Output
+    | "Parameter" -> Parameter
+    | _           -> failwith ("Invalid scope for variable: " ^ s)
+  and datatype_of_json json =
+    let datatype = json |> member "datatype" |> to_string in
+    let init_value = json |> member "initial_value" |> to_string in
+    match datatype with
+    | "bool" -> Bool (bool_of_string init_value)
+    | "int"  -> Int  (int_of_string init_value)
+    | "real" -> Real (float_of_string init_value)
+    | _      -> failwith ("Invalid datatype " ^ datatype
+                          ^ " for variable " ^ (json |> member "name"
+                                                |> to_string))
+  and lustre_datatype_of_json json location =
+    let datatype      = json |> member "datatype"      |> to_string in
+    let initial_value = json |> member "initial_value" |> to_string in
+    match datatype with
+    | "bool" -> (Tydec_bool, mkexpr location
+                   (Expr_const (Const_bool
+                                  (bool_of_string initial_value))))
+    | "int"  -> (Tydec_int, mkexpr location
+                   (Expr_const (Const_int (int_of_string
+                                             initial_value))))
+    | "real" -> (Tydec_real, mkexpr location
+                   (Expr_const (Const_real (Num.num_of_int 0,
+                                           0,
+                                           initial_value))))
+    | _      -> failwith ("Invalid datatype " ^ datatype
+                          ^ " for variable " ^ (json |> member "name"
+                                                |> to_string))
+  and parse_variable json =
+    (*Format.printf "parse_variable@.";*)
+    let location                  = Location.dummy_loc in
+    let (datatype, initial_value) = lustre_datatype_of_json json location in
+    mkvar_decl location ~orig:true
+      ( json |> member "name" |> to_string,
+        {ty_dec_desc = datatype;  ty_dec_loc = location},
+        {ck_dec_desc = Ckdec_any; ck_dec_loc = location},
+        false,
+        Some initial_value
+      )
+end
-- 
GitLab