diff --git a/src/compile.ml b/src/compile.ml index 157b1cee72be4a4bfd8075f152535d78e3b9c810..2adae9801e88d9e812dabd5018761a267ce9e4f0 100644 --- a/src/compile.ml +++ b/src/compile.ml @@ -1,4 +1,4 @@ -(** Time-stamp: <modified the 11/02/2008 (at 09:36) by Erwan Jahier> *) +(** Time-stamp: <modified the 15/02/2008 (at 11:37) by Erwan Jahier> *) open Lxm @@ -31,7 +31,7 @@ let (doit : SyntaxTree.pack_or_model list -> Ident.idref -> unit) = "-- MAIN NODE: \"%s\"\n" (CompiledData.string_of_node_key main_node_key); (* Pour chaque package, on a un solveur de références - globales, pour les types, const et oper : + globales, pour les types, const et node : - les références pointées (p::n) sont recherchées directement dans la syntax_tab puisqu'il n'y a pas d'ambiguité diff --git a/src/compiledData.ml b/src/compiledData.ml index 16b8899c38db0b5d7a788d83d7fc23d92c60792f..a6e79b9a60ce829ab3c81b8c9ee7e9fc382ce3a9 100644 --- a/src/compiledData.ml +++ b/src/compiledData.ml @@ -1,4 +1,4 @@ -(** Time-stamp: <modified the 14/02/2008 (at 17:43) by Erwan Jahier> *) +(** Time-stamp: <modified the 15/02/2008 (at 11:45) by Erwan Jahier> *) (** @@ -51,7 +51,7 @@ - eq_eff : version compilée de eq_info - - func_eff : + - ext_node_eff : déclaration de fonction chéckée (info conservée dans la table des symboles pour résoudre les call) @@ -59,15 +59,15 @@ déclaration de node/template half-chéckée. (info conservée dans la table des symboles pour résoudre les call) - - oper_half_eff : (N.B. utilise dans pack_env) - union de func_eff et node_half_eff. + - node_half_eff : (N.B. utilise dans pack_env) + union de ext_node_eff et node_half_eff. - - oper_eff : + - node_eff : dénotation d'opération, - peut être fonction, predef ou template, + peut être externe, predef ou utilisateur, construit à partir de node_exp. - - node_eff : + - user_node_eff : noeud/template + arguments statiques effectifs, - static_arg_eff : @@ -76,7 +76,7 @@ - pack_env : la "grosse" structure de données qui gère la compilation des packages => implémentée dans CheckGlobal pour la partie type/const/function - (initialisation) et dans CheckOper pour la partie node/template qui + (initialisation) et dans CheckNode pour la partie node/template qui est faite à la demande. - local_env : @@ -93,7 +93,7 @@ - type_of_const_eff : renvoie le type_eff d'une const_eff - string_of_type_eff : pretty-print d'un type_eff - string_of_const_eff : pretty-print d'une const_eff - - string_of_oper_key : pretty-print d'un oper_key + - string_of_node_key : pretty-print d'un node_key _ string_of_slice_eff : ----------------------------------------------------------------------*) @@ -224,36 +224,37 @@ and clock_eff = BaseClockEff | VarClockEff of var_eff (*--------------------------------------------------------------------- -Type : oper_half_eff +Type : node_half_eff ----------------------------------------------------------------------- Union des déclarations de node et de function. N.B. dans le cas des fonctions, on a un info complétement chéckée - (func_eff), par contre pour les nodes on a une info + (ext_node_eff), par contre pour les nodes on a une info à peine chéckée, d'où le nom node_half_eff. => item de la table des symboles d'opération ----------------------------------------------------------------------*) -and oper_half_eff = - FuncRef of func_eff +and node_half_eff = + ExtNodeRef of ext_node_eff | NodeRef of node_half_eff (*--------------------------------------------------------------------- -Type : func_eff +Type : ext_node_eff ----------------------------------------------------------------------- - Construit à partir de func_info + Construit à partir de ext_ node_info ----------------------------------------------------------------------*) -and func_eff = { - fe_name : Ident.t ; - fe_in_types : type_eff list ; - fe_out_types : type_eff list +and ext_node_eff = { + fe_name : Ident.t; + fe_in_types : type_eff list; + fe_out_types : type_eff list; + fe_has_memory : bool; } (*--------------------------------------------------------------------- -Type : node_half_eff +Type : user_node_half_eff ----------------------------------------------------------------------- correspond à un noeud half-checked : on conserve simplement la node_info (on pourra sophistiquer plus tard) ----------------------------------------------------------------------*) -and node_half_eff = SyntaxTreeCore.user_node_info srcflagged +and user_node_half_eff = SyntaxTreeCore.user_node_info srcflagged (*--------------------------------------------------------------------- -Type : node_eff +Type : user_node_eff ----------------------------------------------------------------------- correspond à une instance de template (ou, cas limite, de noeud sans param statique). La clé est un couple ident/liste @@ -264,7 +265,7 @@ Type : node_eff (et pas du clock-checking) ----------------------------------------------------------------------*) -and node_eff = { +and user_node_eff = { nf_key : node_key ; nf_in_types : type_eff list ; nf_out_types : type_eff list ; @@ -272,6 +273,7 @@ and node_eff = { nf_out_formal_clocks : int option list ; nf_asserts : val_eff list; nf_eqs : eq_eff list; + nf_has_memory : bool; } (*--------------------------------------------------------------------- Type : XXX_key @@ -293,29 +295,29 @@ Type : static_arg_eff and static_arg_eff = | ConstStaticArgEff of (Ident.t * const_eff) | TypeStaticArgEff of (Ident.t * type_eff) - | OperStaticArgEff of (Ident.t * oper_eff) + | NodeStaticArgEff of (Ident.t * node_eff) (*--------------------------------------------------------------------- -Type : oper_eff +Type : node_eff ----------------------------------------------------------------------- Version chéckée des node_exp (expression dénotant une opération). Utilisée dans les expressions call, mais aussi comme argument statique ou comme définition de noeud (alias). - Union entre opérateur prédéfini, user_func_eff et node_eff + Union entre opérateur prédéfini, user_ext_node_eff et user_node_eff ----------------------------------------------------------------------*) -and oper_eff = - PredefOper of predef_node - | FuncOper of func_eff - | NodeOper of node_eff +and node_eff = + | PredefEff of predef_node + | ExtNodeEff of ext_node_eff + | UserNodeEff of user_node_eff (*--------------------------------------------------------------------- -Type : oper_alias +Type : node_alias ----------------------------------------------------------------------- item utilisé pour ``résoudre'' les idents d'operation dans local_env : dans un local_env, un identificateur utilisé dans une expression "call" peut pointer sur un opérateur - parfaitement défini (oper_eff), ou sur un noeud half_checké + parfaitement défini (node_eff), ou sur un noeud half_checké ----------------------------------------------------------------------*) -and oper_alias = - CheckedOper of oper_eff +and node_alias = + CheckedNode of node_eff | HalfCheckedNode of node_half_eff @@ -334,8 +336,9 @@ type 'a check_flag = | Checked of 'a | Incorrect -type -world_env = { + + +type world_env = { wenv_src : SyntaxTree.pack_or_model list; wenv_mod_srcs : (Ident.t, SyntaxTree.model_info srcflagged) Hashtbl.t ; wenv_pack_srcs : (Ident.t, SyntaxTree.pack_info srcflagged) Hashtbl.t ; @@ -350,7 +353,7 @@ and pack_env = { (* penv_src : SyntaxTree.package ; *) penv_type_table : (Ident.t, type_eff check_flag) Hashtbl.t ; penv_const_table : (Ident.t, const_eff check_flag) Hashtbl.t ; - penv_oper_table : (Ident.t, oper_half_eff) Hashtbl.t ; + penv_oper_table : (Ident.t, node_half_eff) Hashtbl.t ; penv_node_table : (node_key, node_eff check_flag) Hashtbl.t } (*--------------------------------------------------------------------- @@ -362,7 +365,7 @@ and local_env = { lenv_globals : pack_env ; lenv_types : (Ident.t, type_eff) Hashtbl.t ; lenv_vals : (Ident.t, val_eff) Hashtbl.t ; - lenv_opers : (Ident.t, oper_eff) Hashtbl.t ; + lenv_nodes : (Ident.t, node_eff) Hashtbl.t ; } (* Utilitaires liés aux node_key *) @@ -501,11 +504,14 @@ let rec string_of_node_key (nkey: node_key) = ( match sa with | ConstStaticArgEff (id, ceff) -> sprintf "const %s" (string_of_const_eff ceff) | TypeStaticArgEff (id, teff) -> sprintf "type %s" (string_of_type_eff teff) - | OperStaticArgEff (id, opeff) -> ( + | NodeStaticArgEff (id, opeff) -> ( match opeff with - | PredefOper posop -> sprintf "operator %s" (SyntaxTreeDump.op2string posop) - | FuncOper feff -> sprintf "func %s" (Ident.to_string feff.fe_name) - | NodeOper neff -> sprintf "node %s" (string_of_node_key neff.nf_key) + | PredefEff posop -> + sprintf "operator %s" (SyntaxTreeDump.op2string posop) + | ExtNodeEff feff -> + sprintf "extern node %s" (Ident.to_string feff.fe_name) + | UserNodeEff neff -> + sprintf "node %s" (string_of_node_key neff.nf_key) ) in match nkey with @@ -515,7 +521,7 @@ let rec string_of_node_key (nkey: node_key) = ( sprintf "%s<<%s>>" (Ident.string_of_long ik) (String.concat ", " astrings) ) -let (string_of_node_eff: node_eff -> string) = +let (string_of_user_node_eff: user_node_eff -> string) = fun neff -> (string_of_node_key neff.nf_key) ^ "(" ^ @@ -524,6 +530,22 @@ let (string_of_node_eff: node_eff -> string) = (String.concat ", " (List.map string_of_type_eff neff.nf_out_types)) ^ ") on clock XXX\n" +let (string_of_ext_node_eff: ext_node_eff -> string) = + fun neff -> + "extern " ^ (Ident.to_string neff.fe_name) ^ + "(" ^ + (String.concat ", " (List.map string_of_type_eff neff.fe_in_types)) ^ + ") returns (" ^ + (String.concat ", " (List.map string_of_type_eff neff.fe_out_types)) ^ + ")\n" + +let (string_of_node_eff: node_eff -> string) = + fun neff -> + match neff with + | PredefEff pn -> SyntaxTreeDump.op2string pn + | ExtNodeEff eneff -> string_of_ext_node_eff eneff + | UserNodeEff uneff -> string_of_user_node_eff uneff + let string_of_clock (ck : clock_eff) = ( match ck with BaseClockEff -> "<base>" diff --git a/src/expandPack.ml b/src/expandPack.ml index d5be0b926440bd72a74c77b55a376bbb33b77cc6..00f12c546fd03d72b9a2127d8d7647c7d0a9c541 100644 --- a/src/expandPack.ml +++ b/src/expandPack.ml @@ -1,4 +1,4 @@ -(** Time-stamp: <modified the 11/02/2008 (at 09:37) by Erwan Jahier> *) +(** Time-stamp: <modified the 15/02/2008 (at 10:36) by Erwan Jahier> *) open Lxm open SyntaxTree @@ -81,7 +81,7 @@ let (doit: put_in_tab "const" ctab s y ; newdefs := (ConstItem s)::!newdefs ) - | StaticParamNode (s,inl,outl) -> ( + | StaticParamNode (s,inl,outl,has_memory) -> ( let ne = match (a.it) with StaticArgIdent idr -> ( Lxm.flagit (CallUsrDef (idr,[])) a.src @@ -94,12 +94,14 @@ let (doit: uni_name = s; uni_static_params = [] ; uni_def = NodeAlias (Some(inl,outl), ne) ; + uni_has_mem = has_memory; + uni_is_safe = true; } in let x = Lxm.flagit (NodeInfo ni) p.src in newprov := x::!newprov ; let y = Lxm.flagit ni p.src in put_in_tab "node" otab s y ; - newdefs := (OperItem s)::!newdefs + newdefs := (NodeItem s)::!newdefs ) ) in try ( diff --git a/src/lazyCompiler.ml b/src/lazyCompiler.ml index b9b84831fd66d3318296938d5bf19cbe6480188a..39efb7218484a901bdea6e0b738036505b40e02e 100644 --- a/src/lazyCompiler.ml +++ b/src/lazyCompiler.ml @@ -1,4 +1,4 @@ -(** Time-stamp: <modified the 14/02/2008 (at 17:49) by Erwan Jahier> *) +(** Time-stamp: <modified the 15/02/2008 (at 11:37) by Erwan Jahier> *) open Lxm @@ -89,7 +89,7 @@ fun tbl -> (10) [solve_const_idref] solves constant reference (w.r.t. short/long ident) - nb: for x in {type, const, oper}, there are several functions that returns [x_eff]: + nb: for x in {type, const, node}, there are several functions that returns [x_eff]: - [x_check] o takes an x_key o lookups its (syntaxic) definition (x_info) via the symbolTab.t @@ -469,6 +469,8 @@ and (node_check_do: t -> CompiledData.node_key -> Lxm.t -> SymbolTab.t -> - creer une sorte d'environnement local de compilation, qui permette de gerer les espaces de noms propres aux noeuds (variables, constantes, flots, types) + cf CompiledData.local_env pack_env, et world_env + *) let id_solver = { id2const = solve_const_idref this symbols pack_name; @@ -476,8 +478,8 @@ and (node_check_do: t -> CompiledData.node_key -> Lxm.t -> SymbolTab.t -> id2node = solve_node_idref this symbols pack_name; } in - let make_node_eff itl otl = - { + let make_user_node_eff itl otl hm = + UserNodeEff { nf_key = nk; nf_in_types = itl; nf_out_types = otl; @@ -485,6 +487,7 @@ and (node_check_do: t -> CompiledData.node_key -> Lxm.t -> SymbolTab.t -> nf_out_formal_clocks = []; (* XXX finish me! *) nf_asserts = []; (* XXX finish me! *) nf_eqs = []; (* XXX finish me! *) + nf_has_memory = hm; } in match node_def.it with @@ -498,24 +501,33 @@ and (node_check_do: t -> CompiledData.node_key -> Lxm.t -> SymbolTab.t -> (* id_solver.id2node idref (check_static_arg static_args) lxm *) | NodeAlias (Some (vi_il, vi_ol), _) - | NodeExtern(vi_il, vi_ol) -> + | NodeAbstract(vi_il, vi_ol) -> let aux vi = EvalType.f id_solver vi.it.va_type in - make_node_eff (List.map aux vi_il) (List.map aux vi_ol) + make_user_node_eff + (List.map aux vi_il) (List.map aux vi_ol) n.uni_has_mem | NodeBody nb -> let aux id = let vi = Hashtbl.find nb.nbdy_vartable id in EvalType.f id_solver vi.it.va_type in - make_node_eff + (* ??? c'est vraiment ca qu'il faut faire ??? *) + make_user_node_eff (List.map aux nb.nbdy_inlist) (List.map aux nb.nbdy_outlist) + n.uni_has_mem ) | ExtNode en -> let aux (_,texp) = EvalType.f id_solver texp in - make_node_eff - (List.map aux en.eni_inputs) - (List.map aux en.eni_outputs) + ExtNodeEff { + fe_name = en.eni_name; + fe_in_types =(List.map aux en.eni_inputs); + fe_out_types = (List.map aux en.eni_outputs); + fe_has_memory = en.eni_has_mem; + } + + + (** builds and node_key and calls [node_check] *) @@ -570,7 +582,7 @@ and (node_check_interface: (* try *) (* let sargs = [] in (* ok? *) *) (* let neff = id_solver.id2node idref id_solver sargs sa.src in *) -(* OperStaticArgEff (id, NodeOper neff) *) +(* NodeStaticArgEff (id, NodeEff neff) *) (* with Compile_error _ -> *) (* try *) (* let teff = id_solver.id2type idref sa.src in *) @@ -599,7 +611,7 @@ and (node_check_interface: (* *) (* | StaticArgNode (CallUsrDef (idref, s_args)) -> *) (* let neff = id_solver.id2node idref id_solver s_args sa.src in *) -(* OperStaticArgEff (id, NodeOper neff) *) +(* NodeStaticArgEff (id, NodeEff neff) *) (* in *) (* *) (* SymbolTab.add_ *) @@ -656,7 +668,7 @@ let test_nodes pack_name this id ni_f = flush stdout (* too difficult to test such node easily, so we skip it *) | None -> - test_item this "oper" node_check_interface CompiledData.string_of_node_key + test_item this "node" node_check_interface CompiledData.string_of_node_key string_of_node_eff (fun id -> (Ident.make_long pack_name id, [])) id ni_f diff --git a/src/lexer.mll b/src/lexer.mll index c6a846b9af8c367f12834e02c70b144d9d9d3016..6c22d68b6d7034c33b530358d110e81087c84a5f 100644 --- a/src/lexer.mll +++ b/src/lexer.mll @@ -20,6 +20,8 @@ let handle_lexical_error fn lexbuf = ( (* table des mots-clé *) let keywords = Hashtbl.create 50 ;; +Hashtbl.add keywords "extern" (function x -> TK_EXTERN x) ;; + Hashtbl.add keywords "and" (function x -> TK_AND x) ;; Hashtbl.add keywords "assert" (function x -> TK_ASSERT x) ;; Hashtbl.add keywords "bool" (function x -> TK_BOOL x) ;; @@ -72,6 +74,7 @@ let token_code tk = ( match tk with TK_EOF -> ("TK_EOF" , Lxm.dummy ) | TK_ERROR lxm -> ("TK_ERROR" , lxm) + | TK_EXTERN lxm -> ("TK_EXTERN" , lxm) | TK_AND lxm -> ("TK_AND" , lxm) | TK_ARROW lxm -> ("TK_ARROW" , lxm) | TK_ASSERT lxm -> ("TK_ASSERT" , lxm) diff --git a/src/main.ml b/src/main.ml index 2c90a6ed67887cdada09e3b0d4c5951fc7d80881..ef65502964c3537c1ec5ddd41ba5e40df50def49 100644 --- a/src/main.ml +++ b/src/main.ml @@ -1,4 +1,4 @@ -(** Time-stamp: <modified the 11/02/2008 (at 09:57) by Erwan Jahier> *) +(** Time-stamp: <modified the 15/02/2008 (at 11:39) by Erwan Jahier> *) (** Here follows a description of the different modules used by this lus2lic compiler. @@ -19,7 +19,7 @@ which results into a parse tree containing raw source expressions. syntaxTab.mli/ml syntaxTabUtil.ml/mli expandPack.mli/ml - symbolTab.mli/ml (type/const/oper) + symbolTab.mli/ml (type/const/node) syntaxTab is a kind of layer above syntaxTree to make things easier afterwards. diff --git a/src/parser.mly b/src/parser.mly index a1d633aae7d9aa28b56c6dff4075869aabbe2c4a..00ba220d03486bf2a12853293440c43ecb26b26c 100644 --- a/src/parser.mly +++ b/src/parser.mly @@ -6,7 +6,7 @@ open SyntaxTreeCore (* les var locales pour ranger les resultat intermédaire *) let const_table = Hashtbl.create 50 let type_table = Hashtbl.create 50 -let oper_table = Hashtbl.create 50 +let node_table = Hashtbl.create 50 let def_list = ref [] (* Interface avec SyntaxTree *) @@ -138,6 +138,7 @@ let treat_struct_type (* Traitement d'un noeud externe *) (*********************************) let treat_external_node + (has_memory : bool) (ext_nodelxm : Lxm.t) (inpars : ((Lxm.t list) * type_exp) list) (* liste des ins *) (outpars : ((Lxm.t list) * type_exp) list) (* liste des outs *) @@ -155,18 +156,21 @@ let treat_external_node let flat_ins = ParserUtils.flat_flagged_list inpars make_a_param in (* fabrique la liste à plat des outputs *) let flat_outs = ParserUtils.flat_flagged_list outpars make_a_param in - (* fabrique le extern_node_info *) + (* fabrique le ext_node_info *) let ext_nodestr = Lxm.id ext_nodelxm in let en_info = { eni_name = ext_nodestr; eni_inputs = flat_ins; - eni_outputs = flat_outs + eni_outputs = flat_outs; + eni_has_mem = has_memory; + eni_is_safe = true; } in (* range l'info correspondante dans la table des oper *) - SyntaxTree.add_info oper_table "(extern) node" ext_nodelxm (ExtNode en_info) ; - def_list := (OperItem ext_nodestr) :: !def_list + SyntaxTree.add_info node_table "(extern) node" ext_nodelxm (ExtNode en_info) ; + def_list := (NodeItem ext_nodestr) :: !def_list ) + (********************************************) (* Déclarations de vars et params de noeuds *) (********************************************) @@ -196,6 +200,7 @@ let rec clocked_ids_to_var_infos vnat vdefs = ( ) let treat_node_decl + (has_memory : bool) (nlxm: Lxm.t) (* le lexeme du nom du noeud *) (statics: static_param srcflagged list) (indefs: clocked_ids list) (* descripteur des entrées *) @@ -258,29 +263,57 @@ let treat_node_decl let ninfo = { uni_name = nstr; uni_static_params = statics; - uni_def = nval + uni_def = nval; + uni_has_mem = has_memory; + uni_is_safe = true; } in (* On met le tout dans la table des oper *) - SyntaxTree.add_info oper_table "(extern) node" nlxm (Node (ninfo)) ; - def_list := (OperItem nstr) :: !def_list + SyntaxTree.add_info node_table "(extern) node" nlxm (Node (ninfo)) ; + def_list := (NodeItem nstr) :: !def_list ) let treat_node_alias - (nlxm: Lxm.t) (* le lexeme du nom du noeud *) - (statics: static_param srcflagged list) (* les params statiques formel *) - (dyn: node_profile option) (* l'eventuel profil dyn *) - (value: node_exp srcflagged) (* la valeur *) + (has_memory : bool) + (nlxm: Lxm.t) (* le lexeme du nom du noeud *) + (statics: static_param srcflagged list) (* les params statiques formel *) + (dyn: node_profile option) (* l'eventuel profil dyn *) + (value: node_exp srcflagged) (* la valeur *) = ( let nstr = Lxm.id nlxm in let ninfo = { uni_name = nstr; uni_static_params = statics; - uni_def = NodeAlias (dyn, value) + uni_def = NodeAlias (dyn, value); + uni_has_mem = has_memory; + uni_is_safe = true; } in - SyntaxTree.add_info oper_table "(extern) node" nlxm (Node (ninfo)) ; - def_list := (OperItem nstr) :: !def_list + SyntaxTree.add_info node_table "(extern) node" nlxm (Node (ninfo)) ; + def_list := (NodeItem nstr) :: !def_list ) +(**********************************) +(* Traitement d'un noeud abstrait *) +(**********************************) +let treat_abstract_node + (has_memory : bool) + (lxm : Lxm.t) + (inpars : (((Lxm.t list) * type_exp) list * SyntaxTreeCore.clock_exp) list) + (outpars : (((Lxm.t list) * type_exp) list * SyntaxTreeCore.clock_exp) list) + = (* sortie: unit *) + + let invars = clocked_ids_to_var_infos VarInput inpars in + let outvars = clocked_ids_to_var_infos VarOutput outpars in + let xn = Node { + uni_name = Lxm.id lxm; + uni_static_params = []; + uni_def = NodeAbstract (invars, outvars); + uni_has_mem = has_memory; + uni_is_safe = true; + } in + Lxm.flagit + (NodeInfo xn) + lxm + (* Pour les node proto, c'est un peu plus simple car on ne tabule pas les variables : on garde des listes. on les met juste "a plat" @@ -313,6 +346,8 @@ let flat_output_ids (vdefs: clocked_ids list) = ( %token <Lxm.t> TK_ERROR +%token <Lxm.t> TK_EXTERN + %token <Lxm.t> TK_AND %token <Lxm.t> TK_ARROW %token <Lxm.t> TK_ASSERT @@ -498,16 +533,12 @@ sxOneProvide: /* noeud abstrait */ | TK_NODE sxIdent sxParams TK_RETURNS sxParams { - let invars = clocked_ids_to_var_infos VarInput $3 in - let outvars = clocked_ids_to_var_infos VarOutput $5 in - let xn = Node { - uni_name = Lxm.id $2 ; - uni_static_params = []; - uni_def = NodeExtern (invars, outvars); - } in - Lxm.flagit - (NodeInfo xn) - $2 + treat_abstract_node true $2 $3 $5 + } + /* fonction abstraite */ +| TK_FUNCTION sxIdent sxParams TK_RETURNS sxParams + { + treat_abstract_node false $2 $3 $5 } /* type abstrait ... */ | TK_TYPE sxIdent @@ -635,11 +666,11 @@ sxPackBody: sxDeclList { let res = SyntaxTree.make_packbody - const_table type_table oper_table (List.rev !def_list) in + const_table type_table node_table (List.rev !def_list) in (* clean all ... *) Hashtbl.clear const_table ; Hashtbl.clear type_table ; - Hashtbl.clear oper_table ; + Hashtbl.clear node_table ; def_list := [] ; res } @@ -796,12 +827,14 @@ sxType: ; -/* fonctions */ +/* extern nodes */ sxExtNodeDecl: - TK_FUNCTION sxIdent sxExtNodeParam TK_RETURNS sxExtNodeParam sxOptSemicol + TK_EXTERN TK_FUNCTION sxIdent sxExtNodeParam TK_RETURNS sxExtNodeParam sxOptSemicol + { treat_external_node false $3 (List.rev $4) (List.rev $6) } +| TK_EXTERN TK_NODE sxIdent sxExtNodeParam TK_RETURNS sxExtNodeParam sxOptSemicol /* WARNING ! il faut remettre les listes à l'endroit */ - { treat_external_node $2 (List.rev $3) (List.rev $5) } + { treat_external_node true $3 (List.rev $4) (List.rev $6) } ; @@ -824,10 +857,17 @@ sxNodeDecl: sxLocalNode: TK_NODE sxIdent sxStaticParams sxParams TK_RETURNS sxParams sxOptSemicol sxLocals sxBody sxOptEndNode - { treat_node_decl $2 $3 $4 $6 $8 (fst $9) (snd $9) } + { treat_node_decl true $2 $3 $4 $6 $8 (fst $9) (snd $9) } + | TK_FUNCTION sxIdent sxStaticParams sxParams TK_RETURNS sxParams sxOptSemicol + sxLocals sxBody sxOptEndNode + { treat_node_decl false $2 $3 $4 $6 $8 (fst $9) (snd $9) } | TK_NODE sxIdent sxStaticParams sxNodeProfileOpt TK_EQ sxEffectiveNode sxOptSemicol - { treat_node_alias $2 $3 $4 $6 } + { treat_node_alias true $2 $3 $4 $6 } +; +| TK_FUNCTION sxIdent sxStaticParams sxNodeProfileOpt TK_EQ sxEffectiveNode + sxOptSemicol + { treat_node_alias false $2 $3 $4 $6 } ; sxNodeProfileOpt : @@ -864,7 +904,20 @@ sxStaticParam: let xn = StaticParamNode ( Lxm.id $2, invars, - outvars + outvars, + true + ) in + Lxm.flagit xn $2 + } + | TK_FUNCTION sxIdent sxParams TK_RETURNS sxParams + { + let invars = clocked_ids_to_var_infos VarInput $3 in + let outvars = clocked_ids_to_var_infos VarOutput $5 in + let xn = StaticParamNode ( + Lxm.id $2, + invars, + outvars, + false ) in Lxm.flagit xn $2 } @@ -1159,6 +1212,8 @@ sxStaticArgList: { {src=$1 ; it=StaticArgNode $2.it } } /* un ident OU une expression simple (à résoudre) */ /* c'est au retour qu'on choisit */ + | TK_FUNCTION sxEffectiveNode + { {src=$1 ; it=StaticArgFunc $2.it } } | sxSimpleExp { match $1 with diff --git a/src/symbolTab.ml b/src/symbolTab.ml index b1a9e1f50be6c48cc21547a801f061dea5674c31..37951f44463bd424d7406391e3e70b037fe64e14 100644 --- a/src/symbolTab.ml +++ b/src/symbolTab.ml @@ -1,4 +1,4 @@ -(** Time-stamp: <modified the 11/02/2008 (at 17:44) by Erwan Jahier> *) +(** Time-stamp: <modified the 15/02/2008 (at 11:40) by Erwan Jahier> *) (* Sous-module pour SyntaxTab @@ -37,7 +37,7 @@ let find_const (this: t) (id: Ident.t) lxm = let find_node (this: t) (id: Ident.t) lxm = try Hashtbl.find (this.st_nodes) id - with Not_found -> raise (Compile_error(lxm, "unknown operator")) + with Not_found -> raise (Compile_error(lxm, "unknown node")) (* Manip de SymbolTab.t *) diff --git a/src/syntaxTab.ml b/src/syntaxTab.ml index 1cd4b64023eb75c9aa50cb1555c7a1e7bea220d4..54791cda2aac2ed03da7cff4cf78f609dbfd5b79 100644 --- a/src/syntaxTab.ml +++ b/src/syntaxTab.ml @@ -1,4 +1,4 @@ -(** Time-stamp: <modified the 14/02/2008 (at 17:15) by Erwan Jahier> *) +(** Time-stamp: <modified the 15/02/2008 (at 11:40) by Erwan Jahier> *) (** Table des infos sources : une couche au dessus de SyntaxTree pour mieux @@ -11,7 +11,7 @@ - une pour la vision "exportée" - une pour la vision interne. Chaque table de symbole, 3 "espaces" - de noms (par nature d'items, type/const/oper) + de noms (par nature d'items, type/const/node) Ces tables sont destinées à résoudre les références simples, elle associent à une string : @@ -152,14 +152,14 @@ let init_user_items (this: pack_mng) = ( (TypeItem s) (Lxm.flagit (Ident.make_long pname s) xti.src) in - (* EXPORTATION D'UN oper_info *) + (* EXPORTATION D'UN node_info *) let export_node (s: Ident.t) (xoi: SyntaxTreeCore.node_info srcflagged) = ( - Verbose.printf " export oper %s\n" (Ident.to_string s); - put_in_tab "oper" this.pm_user_items - (OperItem s) + Verbose.printf " export node %s\n" (Ident.to_string s); + put_in_tab "node" this.pm_user_items + (NodeItem s) (Lxm.flagit (Ident.make_long pname s) xoi.src) ) in @@ -327,7 +327,7 @@ init_pack_mng_stabs (this: t) (pname: Ident.pack_name) (pm: pack_mng) = ( Some pt -> SymbolTab.add_import_type pt n iks.it | None -> () ) - | OperItem n -> ( + | NodeItem n -> ( SymbolTab.add_import_node pm.pm_body_stab n iks.it; match pm.pm_provide_stab with Some pt -> SymbolTab.add_import_node pt n iks.it diff --git a/src/syntaxTreeCore.ml b/src/syntaxTreeCore.ml index 2ee8c0f5f7472fa196e2c9c029d278f5ac2e50eb..b50a476e455e49bc2672bd8773669d582467f67d 100644 --- a/src/syntaxTreeCore.ml +++ b/src/syntaxTreeCore.ml @@ -1,4 +1,4 @@ -(** Time-stamp: <modified the 14/02/2008 (at 17:11) by Erwan Jahier> *) +(** Time-stamp: <modified the 15/02/2008 (at 11:45) by Erwan Jahier> *) (** (Raw) Abstract syntax tree of source programs. *) @@ -24,27 +24,34 @@ and and node_info = | Node of user_node_info - | ExtNode of extern_node_info + | ExtNode of ext_node_info and - extern_node_info = { + ext_node_info = { eni_name : Ident.t; eni_inputs : (Ident.t option * type_exp) list; - eni_outputs : (Ident.t option * type_exp) list + eni_outputs : (Ident.t option * type_exp) list; + eni_has_mem : bool; + eni_is_safe : bool; } and user_node_info = { - uni_name : Ident.t ; + uni_name : Ident.t ; uni_static_params : static_param srcflagged list; - uni_def : node_def + uni_def : node_def; + uni_has_mem : bool; + uni_is_safe : bool; } and static_param = | StaticParamType of Ident.t | StaticParamConst of (Ident.t * type_exp) - | StaticParamNode of (Ident.t * var_info srcflagged list * var_info srcflagged list) + | StaticParamNode of + (Ident.t * var_info srcflagged list * var_info srcflagged list * has_mem_flag) + +and has_mem_flag = bool and node_profile = (var_info srcflagged list * var_info srcflagged list) and node_def = - | NodeExtern of node_profile (* XXX rm *) + | NodeAbstract of node_profile | NodeBody of node_body | NodeAlias of node_profile option * node_exp srcflagged @@ -188,6 +195,7 @@ and static_arg = | StaticArgConst of val_exp | StaticArgType of type_exp | StaticArgNode of node_exp + | StaticArgFunc of node_exp (**********************************************************************************) @@ -223,7 +231,7 @@ type type_info = type item_ident = | ConstItem of Ident.t | TypeItem of Ident.t - | OperItem of Ident.t + | NodeItem of Ident.t type item_info = ConstInfo of const_info @@ -246,3 +254,7 @@ let naryexp lxm op elst = CallByPos( {src = lxm ; it = op }, Oper elst ) let bynameexp lxm op nelst = CallByName( {src = lxm ; it = op } , nelst ) + +let node_info_has_memory = function + | Node uni -> uni.uni_has_mem + | ExtNode eni -> eni.eni_has_mem diff --git a/src/syntaxTreeDump.ml b/src/syntaxTreeDump.ml index 5901d9a593362615b3c5e286eb0da42b02a2d999..845434e6574d6ebc788b8df4e30f111d8afc7d93 100644 --- a/src/syntaxTreeDump.ml +++ b/src/syntaxTreeDump.ml @@ -1,4 +1,4 @@ -(** Time-stamp: <modified the 11/02/2008 (at 09:37) by Erwan Jahier> *) +(** Time-stamp: <modified the 15/02/2008 (at 11:45) by Erwan Jahier> *) open Lxm @@ -78,7 +78,7 @@ let rec packbody (os: Format.formatter) (pkg: SyntaxTree.packbody) = match d with ConstItem id -> dump_const os (Hashtbl.find pkg.pk_const_table id) | TypeItem id -> dump_type os (Hashtbl.find pkg.pk_type_table id) - | OperItem id -> ( + | NodeItem id -> ( match (Hashtbl.find pkg.pk_node_table id) with | {src = lxm ; it = Node (ninfo) } -> dump_node os {src = lxm; it = ninfo} @@ -91,7 +91,7 @@ let rec packbody (os: Format.formatter) (pkg: SyntaxTree.packbody) = (match d with ConstItem id | TypeItem id - | OperItem id -> Ident.to_string id + | NodeItem id -> Ident.to_string id )); assert false ) ; @@ -180,7 +180,7 @@ and dump_field (os: Format.formatter) (finfo: field_info) = ( (**************************) (* dump d'une def de func *) (**************************) -and dump_ext_node (os: Format.formatter) (x: extern_node_info srcflagged) = ( +and dump_ext_node (os: Format.formatter) (x: ext_node_info srcflagged) = ( let lxm = x.src and info = x.it in fprintf os "-- %s" (Lxm.details lxm) ; fprintf os " (external function)@\n" ; @@ -246,8 +246,10 @@ and dump_static_param | StaticParamType id -> fprintf os "type %s" (Ident.to_string id) | StaticParamConst (id, exp) -> fprintf os "const %s : %a" (Ident.to_string id) dump_type_exp exp - | StaticParamNode (id, ins, outs) -> ( - fprintf os "node %s(@,%a@,)returns(@,%a@,)" (Ident.to_string id) + | StaticParamNode (id, ins, outs, has_mem) -> ( + fprintf os "%s %s(@,%a@,)returns(@,%a@,)" + (if has_mem then "node" else "function") + (Ident.to_string id) dump_line_var_decl_list ins dump_line_var_decl_list outs ) ) @@ -268,7 +270,9 @@ and dump_node (os: Format.formatter) (x: user_node_info srcflagged) = ( NodeBody nbody -> dump_node_body os nbody | NodeAlias (_,{it = nexp; src = lxm}) -> fprintf os " = @,%a;@\n" dump_node_exp nexp - | NodeExtern _ -> assert false + | NodeAbstract _ -> + fprintf os " finish me (dump_node: print abstract node)"; + assert false ) and dump_node_body (os: Format.formatter) (nbody: node_body) = ( @@ -568,21 +572,14 @@ and dump_static_arg_list and dump_static_arg (os : Format.formatter) (sa: static_arg) - = ( + = match sa with - StaticArgIdent id -> ( - fprintf os "%s" (Ident.string_of_idref id) - ) | - StaticArgConst ve -> ( - fprintf os "const %a" dump_val_exp ve - ) | - StaticArgType te -> ( - fprintf os "type %a" dump_type_exp te - ) | - StaticArgNode ne -> ( - fprintf os "node %a" dump_node_exp ne - ) - ) + | StaticArgIdent id -> fprintf os "%s" (Ident.string_of_idref id) + | StaticArgConst ve -> fprintf os "const %a" dump_val_exp ve + | StaticArgType te -> fprintf os "type %a" dump_type_exp te + | StaticArgNode ne -> fprintf os "node %a" dump_node_exp ne + | StaticArgFunc ne -> fprintf os "function %a" dump_node_exp ne + and dump_slice_info (os : Format.formatter) (sl: slice_info) diff --git a/src/test/Makefile b/src/test/Makefile index 79ed53dc538c133a0cfbe953054e62810d98fcc0..ae6d6b214c3680e485947ec21207836d8362bae9 100644 --- a/src/test/Makefile +++ b/src/test/Makefile @@ -53,6 +53,9 @@ test: echo " " >> test.res; echo -e "$(NL)====> $(LC) heater_control.lus" >> test.res $(LC) heater_control.lus >> test.res 2>&1 \ + echo " " >> test.res; echo -e "$(NL)====> $(LC) func_with_body.lus" >> test.res + $(LC) func_with_body.lus >> test.res 2>&1 || true + \ echo " " >> test.res; echo -e "$(NL)====> $(LC) pfs.lus" >> test.res $(LC) pfs.lus >> test.res 2>&1 || true \ diff --git a/src/test/func_with_body.lus b/src/test/func_with_body.lus new file mode 100644 index 0000000000000000000000000000000000000000..074d0a086b5c8a848b8ad15ddedf3dcb9772f6f3 --- /dev/null +++ b/src/test/func_with_body.lus @@ -0,0 +1,12 @@ +-- an intern function +function trivial(x : int) returns (y : int); +let + y = 1; +tel + + +-- and an extern node +extern node ext(x : int) returns (y : int); + + + diff --git a/src/test/t0.lus b/src/test/t0.lus index d0b40e09c349e4ed33dba1f1507dc8b7ede47ef9..82250da4287baaf6c14c9e54dbb9abc131308e42 100644 --- a/src/test/t0.lus +++ b/src/test/t0.lus @@ -1,6 +1,6 @@ -- Test main node load -function max(x : int; y : int) returns (mx: int); +extern function max(x : int; y : int) returns (mx: int); node min(x : int; y : int) returns (mn : int); let diff --git a/src/test/test.res.exp b/src/test/test.res.exp index 2f520306c4b29253ba83c0bdae2eb1316d6a1cfa..2a61ba515b5312df57f7b07d046f67c36deb5be0 100644 --- a/src/test/test.res.exp +++ b/src/test/test.res.exp @@ -5,19 +5,19 @@ Non-regression tests *** SyntaxTab.create pass 1 *** SyntaxTab.create pass 2 init pack inter - export oper preced + export node preced export const n export type selType init pack mainPack - export oper preced + export node preced init pack pint - export oper fby1 + export node fby1 export type t init pack pbool - export oper fby1 + export node fby1 export type t init pack preal - export oper fby1 + export node fby1 export type t *** SyntaxTab.create pass 3 init symbol tables for pack inter @@ -46,21 +46,21 @@ End of Syntax table dump. type preal::t = real Exported constants: Exported nodes: - oper preal::fby1 = preal::fby1(real, real) returns (real) on clock XXX + node preal::fby1 = preal::fby1(real, real) returns (real) on clock XXX * package pbool Exported types: type pbool::t = bool Exported constants: Exported nodes: - oper pbool::fby1 = pbool::fby1(bool, bool) returns (bool) on clock XXX + node pbool::fby1 = pbool::fby1(bool, bool) returns (bool) on clock XXX * package pint Exported types: type pint::t = int Exported constants: Exported nodes: - oper pint::fby1 = pint::fby1(int, int) returns (int) on clock XXX + node pint::fby1 = pint::fby1(int, int) returns (int) on clock XXX * package mainPack Exported types: @@ -68,9 +68,9 @@ End of Syntax table dump. Exported constants: const mainPack::n = inter::n (imported) Exported nodes: - oper mainPack::preced = mainPack::preced(inter::selType) returns (inter::selType) on clock XXX + node mainPack::preced = mainPack::preced(inter::selType) returns (inter::selType) on clock XXX - oper mainPack::preced = inter::preced (imported) + node mainPack::preced = inter::preced (imported) * package inter Exported types: type inter::t = preal::t (imported) @@ -78,8 +78,8 @@ End of Syntax table dump. Exported constants: const inter::n = -4 Exported nodes: - oper inter::fby1 = preal::fby1 (imported) - oper inter::preced = inter::preced( {i : int; b : bool; r : real}) returns ( {i : int; b : bool; r : real}, {i : int; b : bool; r : real}) on clock XXX + node inter::fby1 = preal::fby1 (imported) + node inter::preced = inter::preced( {i : int; b : bool; r : real}) returns ( {i : int; b : bool; r : real}, {i : int; b : bool; r : real}) on clock XXX ---------------------------------------------------------------------- @@ -88,7 +88,7 @@ End of Syntax table dump. *** SyntaxTab.create pass 2 init pack dummy export type Toto - export oper bibi + export node bibi *** SyntaxTab.create pass 3 init symbol tables for pack dummy *** SyntaxTab.create done @@ -107,7 +107,7 @@ End of Syntax table dump. type dummy::Toto = {x : int (1); y : int (2)} Exported constants: Exported nodes: - oper dummy::bibi = dummy::bibi(int) returns ( {x : int (1); y : int (2)}) on clock XXX + node dummy::bibi = dummy::bibi(int) returns ( {x : int (1); y : int (2)}) on clock XXX ---------------------------------------------------------------------- @@ -115,10 +115,10 @@ End of Syntax table dump. *** SyntaxTab.create pass 1 *** SyntaxTab.create pass 2 init pack dummy - export oper min_4 - export oper min - export oper min_n - export oper max + export node min_4 + export node min + export node min_n + export node max *** SyntaxTab.create pass 3 init symbol tables for pack dummy *** SyntaxTab.create done @@ -137,7 +137,7 @@ End of Syntax table dump. Exported constants: Exported nodes: -*** oops: an internal error occurred in file lazyCompiler.ml, line 499, column 5 +*** oops: an internal error occurred in file lazyCompiler.ml, line 500, column 5 *** when compiling lustre program t0.lus ---------------------------------------------------------------------- @@ -145,11 +145,11 @@ End of Syntax table dump. *** SyntaxTab.create pass 1 *** SyntaxTab.create pass 2 init pack dummy - export oper fold_left - export oper consensus_6_bis - export oper consensus_6 - export oper consensus_bis - export oper consensus + export node fold_left + export node consensus_6_bis + export node consensus_6 + export node consensus_bis + export node consensus *** SyntaxTab.create pass 3 init symbol tables for pack dummy *** SyntaxTab.create done @@ -169,7 +169,7 @@ End of Syntax table dump. Exported nodes: ### skipping fold_left -*** oops: an internal error occurred in file lazyCompiler.ml, line 499, column 5 +*** oops: an internal error occurred in file lazyCompiler.ml, line 500, column 5 *** when compiling lustre program t2.lus ---------------------------------------------------------------------- @@ -204,7 +204,7 @@ End of Syntax table dump. *** SyntaxTab.create pass 1 *** SyntaxTab.create pass 2 init pack dummy - export oper trivial + export node trivial *** SyntaxTab.create pass 3 init symbol tables for pack dummy *** SyntaxTab.create done @@ -222,7 +222,7 @@ End of Syntax table dump. Exported types: Exported constants: Exported nodes: - oper dummy::trivial = dummy::trivial(int) returns (int) on clock XXX + node dummy::trivial = dummy::trivial(int) returns (int) on clock XXX ---------------------------------------------------------------------- @@ -263,10 +263,10 @@ End of Syntax table dump. *** SyntaxTab.create pass 1 *** SyntaxTab.create pass 2 init pack dummy - export oper main - export oper main2 - export oper consensus - export oper c8 + export node main + export node main2 + export node consensus + export node c8 *** SyntaxTab.create pass 3 init symbol tables for pack dummy *** SyntaxTab.create done @@ -284,10 +284,10 @@ End of Syntax table dump. Exported types: Exported constants: Exported nodes: - oper dummy::main = dummy::main(bool^4) returns (bool) on clock XXX + node dummy::main = dummy::main(bool^4) returns (bool) on clock XXX -*** oops: an internal error occurred in file lazyCompiler.ml, line 499, column 5 +*** oops: an internal error occurred in file lazyCompiler.ml, line 500, column 5 *** when compiling lustre program consensus.lus ---------------------------------------------------------------------- @@ -296,7 +296,7 @@ End of Syntax table dump. *** SyntaxTab.create pass 2 init pack dummy export type truc - export oper toto + export node toto *** SyntaxTab.create pass 3 init symbol tables for pack dummy *** SyntaxTab.create done @@ -315,7 +315,7 @@ End of Syntax table dump. type dummy::truc = {a : bool^100; b : int} Exported constants: Exported nodes: - oper dummy::toto = dummy::toto(bool) returns ( {a : bool^100; b : int}^3) on clock XXX + node dummy::toto = dummy::toto(bool) returns ( {a : bool^100; b : int}^3) on clock XXX ---------------------------------------------------------------------- @@ -323,7 +323,7 @@ End of Syntax table dump. *** SyntaxTab.create pass 1 *** SyntaxTab.create pass 2 init pack inter - export oper preced + export node preced export const n export type selType export enum const X @@ -337,15 +337,15 @@ End of Syntax table dump. export type couleurs export const N export const X - export oper preced + export node preced init pack pint - export oper fby1 + export node fby1 export type t init pack pbool - export oper fby1 + export node fby1 export type t init pack preal - export oper fby1 + export node fby1 export type t *** SyntaxTab.create pass 3 init symbol tables for pack inter @@ -374,21 +374,21 @@ End of Syntax table dump. type preal::t = real Exported constants: Exported nodes: - oper preal::fby1 = preal::fby1(real, real) returns (real) on clock XXX + node preal::fby1 = preal::fby1(real, real) returns (real) on clock XXX * package pbool Exported types: type pbool::t = bool Exported constants: Exported nodes: - oper pbool::fby1 = pbool::fby1(bool, bool) returns (bool) on clock XXX + node pbool::fby1 = pbool::fby1(bool, bool) returns (bool) on clock XXX * package pint Exported types: type pint::t = int Exported constants: Exported nodes: - oper pint::fby1 = pint::fby1(int, int) returns (int) on clock XXX + node pint::fby1 = pint::fby1(int, int) returns (int) on clock XXX * package mainPack Exported types: @@ -405,9 +405,9 @@ End of Syntax table dump. const mainPack::X = 8 const mainPack::Y = inter::Y (imported) Exported nodes: - oper mainPack::preced = mainPack::preced(inter::selType) returns (inter::selType) on clock XXX + node mainPack::preced = mainPack::preced(inter::selType) returns (inter::selType) on clock XXX - oper mainPack::preced = inter::preced (imported) + node mainPack::preced = inter::preced (imported) * package inter Exported types: type inter::t = preal::t (imported) @@ -418,8 +418,8 @@ End of Syntax table dump. const inter::X = inter::X const inter::Y = inter::Y Exported nodes: - oper inter::fby1 = preal::fby1 (imported) - oper inter::preced = inter::preced( {i : int; b : bool; r : real}) returns ( {i : int; b : bool; r : real}, {i : int; b : bool; r : real}) on clock XXX + node inter::fby1 = preal::fby1 (imported) + node inter::preced = inter::preced( {i : int; b : bool; r : real}) returns ( {i : int; b : bool; r : real}, {i : int; b : bool; r : real}) on clock XXX ---------------------------------------------------------------------- @@ -427,19 +427,19 @@ End of Syntax table dump. *** SyntaxTab.create pass 1 *** SyntaxTab.create pass 2 init pack inter - export oper preced + export node preced export const n export type selType init pack mainPack - export oper preced + export node preced init pack pint - export oper fby1 + export node fby1 export type t init pack pbool - export oper fby1 + export node fby1 export type t init pack preal - export oper fby1 + export node fby1 export type t *** SyntaxTab.create pass 3 init symbol tables for pack inter @@ -468,21 +468,21 @@ End of Syntax table dump. type preal::t = real Exported constants: Exported nodes: - oper preal::fby1 = preal::fby1(real, real) returns (real) on clock XXX + node preal::fby1 = preal::fby1(real, real) returns (real) on clock XXX * package pbool Exported types: type pbool::t = bool Exported constants: Exported nodes: - oper pbool::fby1 = pbool::fby1(bool, bool) returns (bool) on clock XXX + node pbool::fby1 = pbool::fby1(bool, bool) returns (bool) on clock XXX * package pint Exported types: type pint::t = int Exported constants: Exported nodes: - oper pint::fby1 = pint::fby1(int, int) returns (int) on clock XXX + node pint::fby1 = pint::fby1(int, int) returns (int) on clock XXX * package mainPack Exported types: @@ -490,9 +490,9 @@ End of Syntax table dump. Exported constants: const mainPack::n = inter::n (imported) Exported nodes: - oper mainPack::preced = mainPack::preced(inter::selType) returns (inter::selType) on clock XXX + node mainPack::preced = mainPack::preced(inter::selType) returns (inter::selType) on clock XXX - oper mainPack::preced = inter::preced (imported) + node mainPack::preced = inter::preced (imported) * package inter Exported types: type inter::t = preal::t (imported) @@ -500,8 +500,8 @@ End of Syntax table dump. Exported constants: const inter::n = -4 Exported nodes: - oper inter::fby1 = preal::fby1 (imported) - oper inter::preced = inter::preced( {i : int; b : bool; r : real}) returns ( {i : int; b : bool; r : real}, {i : int; b : bool; r : real}) on clock XXX + node inter::fby1 = preal::fby1 (imported) + node inter::preced = inter::preced( {i : int; b : bool; r : real}) returns ( {i : int; b : bool; r : real}, {i : int; b : bool; r : real}) on clock XXX ---------------------------------------------------------------------- @@ -511,8 +511,8 @@ End of Syntax table dump. init pack dummy export const A export const B - export oper map2 - export oper toto + export node map2 + export node toto *** SyntaxTab.create pass 3 init symbol tables for pack dummy *** SyntaxTab.create done @@ -537,7 +537,7 @@ End of Syntax table dump. *** SyntaxTab.create pass 1 *** SyntaxTab.create pass 2 init pack dummy - export oper trivial + export node trivial *** SyntaxTab.create pass 3 init symbol tables for pack dummy *** SyntaxTab.create done @@ -555,7 +555,7 @@ End of Syntax table dump. Exported types: Exported constants: Exported nodes: - oper dummy::trivial = dummy::trivial(int) returns (int) on clock XXX + node dummy::trivial = dummy::trivial(int) returns (int) on clock XXX ---------------------------------------------------------------------- @@ -563,9 +563,9 @@ End of Syntax table dump. *** SyntaxTab.create pass 1 *** SyntaxTab.create pass 2 init pack dummy - export oper fold_left - export oper consensus - export oper bt_void + export node fold_left + export node consensus + export node bt_void *** SyntaxTab.create pass 3 init symbol tables for pack dummy *** SyntaxTab.create done @@ -621,30 +621,30 @@ End of Syntax table dump. export const BID_VAL export const TIME_CROSS_ROLL export const CROSS_CH_TOL_YAW - export oper Calculate - export oper onlyroll - export oper Median - export oper oneoffour - export oper MedianValue3 - export oper Monitor - export oper Allocator - export oper Channel - export oper min2 - export oper min4 - export oper max2 - export oper max4 - export oper OlympicAverage - export oper InHardoverRange - export oper twooffour - export oper noneof - export oper threeoffour - export oper InNominalRange - export oper FailDetect - export oper abs - export oper Average2 - export oper Average - export oper maintain - export oper values_nok + export node Calculate + export node onlyroll + export node Median + export node oneoffour + export node MedianValue3 + export node Monitor + export node Allocator + export node Channel + export node min2 + export node min4 + export node max2 + export node max4 + export node OlympicAverage + export node InHardoverRange + export node twooffour + export node noneof + export node threeoffour + export node InNominalRange + export node FailDetect + export node abs + export node Average2 + export node Average + export node maintain + export node values_nok *** SyntaxTab.create pass 3 init symbol tables for pack dummy *** SyntaxTab.create done @@ -691,53 +691,53 @@ End of Syntax table dump. const dummy::CROSS_CH_TOL_YAW = 10.000000 const dummy::TIME_CROSS_ROLL = 3 Exported nodes: - oper dummy::Calculate = dummy::Calculate(real, real, real, real, bool, bool, bool, bool) returns (real) on clock XXX + node dummy::Calculate = dummy::Calculate(real, real, real, real, bool, bool, bool, bool) returns (real) on clock XXX - oper dummy::onlyroll = dummy::onlyroll(real, real, real, real, real, real, real, real, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool) returns (real, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, int, int, int, int) on clock XXX + node dummy::onlyroll = dummy::onlyroll(real, real, real, real, real, real, real, real, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool) returns (real, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, int, int, int, int) on clock XXX - oper dummy::Median = dummy::Median(real, real, real, real, bool, bool, bool, bool) returns (real) on clock XXX + node dummy::Median = dummy::Median(real, real, real, real, bool, bool, bool, bool) returns (real) on clock XXX - oper dummy::oneoffour = dummy::oneoffour(bool, bool, bool, bool) returns (bool) on clock XXX + node dummy::oneoffour = dummy::oneoffour(bool, bool, bool, bool) returns (bool) on clock XXX - oper dummy::MedianValue3 = dummy::MedianValue3(real, real, real) returns (real) on clock XXX + node dummy::MedianValue3 = dummy::MedianValue3(real, real, real) returns (real) on clock XXX - oper dummy::Monitor = dummy::Monitor(real, real, bool) returns (real, bool) on clock XXX + node dummy::Monitor = dummy::Monitor(real, real, bool) returns (real, bool) on clock XXX - oper dummy::Allocator = dummy::Allocator(bool, bool, bool, bool, bool) returns (bool, bool, bool, bool) on clock XXX + node dummy::Allocator = dummy::Allocator(bool, bool, bool, bool, bool) returns (bool, bool, bool, bool) on clock XXX - oper dummy::Channel = dummy::Channel(bool, bool, bool, real, real, bool, real, real, real, bool, bool, bool, bool) returns (real, bool, bool, bool, bool, int) on clock XXX + node dummy::Channel = dummy::Channel(bool, bool, bool, real, real, bool, real, real, real, bool, bool, bool, bool) returns (real, bool, bool, bool, bool, int) on clock XXX - oper dummy::min2 = dummy::min2(real, real) returns (real) on clock XXX + node dummy::min2 = dummy::min2(real, real) returns (real) on clock XXX - oper dummy::max2 = dummy::max2(real, real) returns (real) on clock XXX + node dummy::max2 = dummy::max2(real, real) returns (real) on clock XXX - oper dummy::min4 = dummy::min4(real, real, real, real) returns (real) on clock XXX + node dummy::min4 = dummy::min4(real, real, real, real) returns (real) on clock XXX - oper dummy::OlympicAverage = dummy::OlympicAverage(real, real, real, real) returns (real) on clock XXX + node dummy::OlympicAverage = dummy::OlympicAverage(real, real, real, real) returns (real) on clock XXX - oper dummy::max4 = dummy::max4(real, real, real, real) returns (real) on clock XXX + node dummy::max4 = dummy::max4(real, real, real, real) returns (real) on clock XXX - oper dummy::InHardoverRange = dummy::InHardoverRange(real) returns (bool) on clock XXX + node dummy::InHardoverRange = dummy::InHardoverRange(real) returns (bool) on clock XXX - oper dummy::noneof = dummy::noneof(bool, bool, bool, bool) returns (bool) on clock XXX + node dummy::noneof = dummy::noneof(bool, bool, bool, bool) returns (bool) on clock XXX - oper dummy::twooffour = dummy::twooffour(bool, bool, bool, bool) returns (bool) on clock XXX + node dummy::twooffour = dummy::twooffour(bool, bool, bool, bool) returns (bool) on clock XXX - oper dummy::threeoffour = dummy::threeoffour(bool, bool, bool, bool) returns (bool) on clock XXX + node dummy::threeoffour = dummy::threeoffour(bool, bool, bool, bool) returns (bool) on clock XXX - oper dummy::InNominalRange = dummy::InNominalRange(real) returns (bool) on clock XXX + node dummy::InNominalRange = dummy::InNominalRange(real) returns (bool) on clock XXX - oper dummy::FailDetect = dummy::FailDetect(bool, real, bool, bool, bool, real, real, real, bool, bool, bool, bool) returns (bool, bool, int, bool) on clock XXX + node dummy::FailDetect = dummy::FailDetect(bool, real, bool, bool, bool, real, real, real, bool, bool, bool, bool) returns (bool, bool, int, bool) on clock XXX - oper dummy::abs = dummy::abs(real) returns (real) on clock XXX + node dummy::abs = dummy::abs(real) returns (real) on clock XXX - oper dummy::Average2 = dummy::Average2(real, real) returns (real) on clock XXX + node dummy::Average2 = dummy::Average2(real, real) returns (real) on clock XXX - oper dummy::Average = dummy::Average(real, real, real, real, bool, bool, bool, bool) returns (real) on clock XXX + node dummy::Average = dummy::Average(real, real, real, real, bool, bool, bool, bool) returns (real) on clock XXX - oper dummy::values_nok = dummy::values_nok(bool, bool, bool, real, real, real, real) returns (bool) on clock XXX + node dummy::values_nok = dummy::values_nok(bool, bool, bool, real, real, real, real) returns (bool) on clock XXX - oper dummy::maintain = dummy::maintain(int, bool) returns (bool) on clock XXX + node dummy::maintain = dummy::maintain(int, bool) returns (bool) on clock XXX ---------------------------------------------------------------------- @@ -749,17 +749,17 @@ End of Syntax table dump. export const TMIN export const TMAX export const DELTA - export oper not_a_sauna2 - export oper Median - export oper heater_control - export oper min2 - export oper max2 - export oper alloftree - export oper not_a_sauna - export oper abs - export oper noneoftree - export oper oneoftree - export oper Average + export node not_a_sauna2 + export node Median + export node heater_control + export node min2 + export node max2 + export node alloftree + export node not_a_sauna + export node abs + export node noneoftree + export node oneoftree + export node Average *** SyntaxTab.create pass 3 init symbol tables for pack dummy *** SyntaxTab.create done @@ -781,27 +781,56 @@ End of Syntax table dump. const dummy::TMAX = 9.000000 const dummy::DELTA = 0.500000 Exported nodes: - oper dummy::not_a_sauna2 = dummy::not_a_sauna2(real, real, real, real, bool) returns (bool) on clock XXX + node dummy::not_a_sauna2 = dummy::not_a_sauna2(real, real, real, real, bool) returns (bool) on clock XXX - oper dummy::Median = dummy::Median(real, real, real) returns (real) on clock XXX + node dummy::Median = dummy::Median(real, real, real) returns (real) on clock XXX - oper dummy::heater_control = dummy::heater_control(real, real, real, real) returns (bool) on clock XXX + node dummy::heater_control = dummy::heater_control(real, real, real, real) returns (bool) on clock XXX - oper dummy::min2 = dummy::min2(real, real) returns (real) on clock XXX + node dummy::min2 = dummy::min2(real, real) returns (real) on clock XXX - oper dummy::max2 = dummy::max2(real, real) returns (real) on clock XXX + node dummy::max2 = dummy::max2(real, real) returns (real) on clock XXX - oper dummy::not_a_sauna = dummy::not_a_sauna(real, real, real, real, bool) returns (bool) on clock XXX + node dummy::not_a_sauna = dummy::not_a_sauna(real, real, real, real, bool) returns (bool) on clock XXX - oper dummy::alloftree = dummy::alloftree(bool, bool, bool) returns (bool) on clock XXX + node dummy::alloftree = dummy::alloftree(bool, bool, bool) returns (bool) on clock XXX - oper dummy::abs = dummy::abs(real) returns (real) on clock XXX + node dummy::abs = dummy::abs(real) returns (real) on clock XXX - oper dummy::noneoftree = dummy::noneoftree(bool, bool, bool) returns (bool) on clock XXX + node dummy::noneoftree = dummy::noneoftree(bool, bool, bool) returns (bool) on clock XXX - oper dummy::Average = dummy::Average(real, real) returns (real) on clock XXX + node dummy::Average = dummy::Average(real, real) returns (real) on clock XXX - oper dummy::oneoftree = dummy::oneoftree(bool, bool, bool) returns (bool) on clock XXX + node dummy::oneoftree = dummy::oneoftree(bool, bool, bool) returns (bool) on clock XXX + + +---------------------------------------------------------------------- +====> ../lus2lic -vl 3 func_with_body.lus +*** SyntaxTab.create pass 1 +*** SyntaxTab.create pass 2 + init pack dummy + export node ext + export node trivial +*** SyntaxTab.create pass 3 + init symbol tables for pack dummy +*** SyntaxTab.create done +*** « Syntax table dump: + - Package or model list: + func_with_body (pack) + + - Raw model table: + - Raw Package table: dummy + - Package manager table: dummy +End of Syntax table dump. » +-- MAIN NODE: "func_with_body::main" +*** Dump the exported items of the packages. + * package dummy + Exported types: + Exported constants: + Exported nodes: + node dummy::ext = extern ext(int) returns (int) + + node dummy::trivial = dummy::trivial(int) returns (int) on clock XXX ----------------------------------------------------------------------