From 34d27b98edf8700511cc670c7c1bfed17718db0d Mon Sep 17 00:00:00 2001 From: Erwan Jahier <jahier@imag.fr> Date: Thu, 29 May 2008 14:45:34 +0200 Subject: [PATCH] Allow the use of "=" instead of "is" in order to instanciate package. Better error msg when instanciating a model by provided a wrong number of arguments. --- src/TODO | 123 +++++++--------- src/expandPack.ml | 144 ++++++++++--------- src/parser.mly | 12 +- src/syntaxTab.ml | 4 +- src/test/should_work/Pascal/t0.lus | 7 +- src/test/should_work/Pascal/t2.lus | 1 + src/test/should_work/demo/mapiter_lv4.lus | 45 ------ src/test/should_work/packEnvTest/Condact.lus | 15 +- src/test/test.res.exp | 83 ++++++----- 9 files changed, 200 insertions(+), 234 deletions(-) delete mode 100644 src/test/should_work/demo/mapiter_lv4.lus diff --git a/src/TODO b/src/TODO index 779c2eb7..511200f0 100644 --- a/src/TODO +++ b/src/TODO @@ -1,6 +1,5 @@ -*** questions - +*** questions externes * dans le generateur de lic, comment imprimer le nom des packages ? - Pack::toto -> pas du vieux lustre (donc pas reentrant) @@ -15,38 +14,11 @@ pour l'instant, alors que ca marchait chez Youssef. * should_work/packEnvTest/packages2.lus : il y a des package + le package principal est implicite. Autorise-t'on ce genre de mélange ? -* should_work/NONREG/simple.lus - declaration de structure en ligne ??? - - -* should_work/demo/alias.lus - Quid du module Lustre ??? - * enum : avec des parentheses ou des accolades ? -* autorise t'on les trucs du genre: - - min_4 = min_n<< 4, toto<<2>> >> ; - - ou doit-on ecrire - - toto_2 = toto<<2>>; - min_4 = min_n<< 4, toto_2 >> ; - -? - -* mettre pre, current, when, etc. dans predef ? - -* dans le cas des constantes statiquement evaluables j'ai defini -">" et consort comme étant polymorphes, parce que c'est -facile en caml. Mais est-ce une bonne idée ? - -* le mot cled "struct" est optionel devant une definition de -structure -> est-ce vraiment une bonne idée ? - -* Ident.idref : a remettre dans SyntaxTree ? en tout cas, je devrais -m'en etre completement debarassé au niveau du compiledData, et ca -n'est pas le cas pour l'instant... +* j'ai defini ">" et consort comme étant polymorphes (et pas +seulement surchargées), parce que c'est facile en caml (via +Pervasive.comare). Mais est-ce une bonne idée ? * slice_info_eff width = size ? Le commentaire dit S[i] = A[first + i*step] pour i = 0 .. width @@ -55,9 +27,6 @@ mais j'ai l'impression que ce devrait etre cad S[i] = A[first + i*step] pour i = 0 .. (size-1) -* verifier que chacun des exemples du repertoire "should_fail" à une -correspondance dans le manuel, et reciproquement... - * Que fait-on des constantes réelles ? par exemple, dans test/should_work/NONREG/simple.lus, @@ -74,6 +43,38 @@ les operateurs aritmetiques, bof. * pour l'evaluation statique de l'egalité, j'ai pas fait pareil... -> à discuter (cf predefInfo.ml) +* Evaluer statiquement les iterateurs quand c'est possible (cf + evalConst.ml) ? + +* rajouter la notion de variables polymorphes et sur-chargées au + niveau noeud utilisateur ? Ce devrait etre peanuts maintenant que + je les ai en interne... + +* autoriser les alias sur "nor" et "#" ? (ca complique les choses + pour bien peu...). + +* maintenant que je peux definir des trucs du genre + x = map<<+;3>> + ai-je encore besoin de Lustre::plus et consort ??? + +* au sujet des pragma: + ex : %ASSUME:assumeSelectElementOfRank_inArray_% + je les ai rajouté (un peu) dans le parseurs + -> 3 shift/reduce conflicts ! + et puis il faut que je les mettre partout -> changer une autre + regle ? sxIdent ? + + +*********************************************************************************** +*********************************************************************************** +*** questions pour bibi + +* essayer de faire qque chose pour les 2 verrues dans predefSemantics + +* splitter predefsemantics en predefTyping et PredefEval? + les function type_error des predefSemantics devraient être + definies ailleurs en ce cas. + o Lazycompiler.solve_x_idref Comment se faisse que je n'ai pas besoin de me servir de cet @@ -90,26 +91,12 @@ lazycompiler.ml: Simplify a little bit a couple of functions (avoiding code duplication basically). -* Evaluer statiquement les iterateurs quand c'est possible (cf - evalConst.ml) ? - -* rajouter la notion de variables polymorphes et sur-chargées au - niveau noeud utilisateur ? Ce devrait etre peanuts maintenant que - je les ai en interne... - -* splitter predefsemantics en predefTyping et PredefEval? - les function type_error des predefSemantics devraient être - definies ailleurs en ce cas. - - -* autoriser les alias sur "nor" et "#" ? (ca complique les choses - pour bien peu...). +* mettre pre, current, when, etc. dans predef ? -* essayer de faire qque chose pour les 2 verrues dans predefSemantics +* Ident.idref : a remettre dans SyntaxTree ? en tout cas, je devrais +m'en etre completement debarassé au niveau du compiledData, et ca +n'est pas le cas pour l'instant... -* maintenant que je peux definir des trucs du genre - x = map<<+;3>> - ai-je encore besoin de Lustre::plus et consort ??? *********************************************************************************** *********************************************************************************** @@ -119,9 +106,6 @@ lazycompiler.ml: *** facile -* ../lus2lic -n consensus_6 should_work/Pascal/t2.lus - -* Verifier que les test de map_red couvre les cas tordus. * "1..2" ne marche pas car le lexer renvoie "1." ".2" @@ -139,8 +123,6 @@ generer les lexemes qui vont bien, tk_real+tk_real -> tk_int+tk_dotdot+tk_int - - * Dans les messages d'erreurs, le numero de colonne est faux à cause des tabulations * quand je passe 2 fichiers en arg de la ligne de commande, sur @@ -150,29 +132,19 @@ generer les lexemes qui vont bien, - - - *** moins facile * le clock checking * le merge -* les itérateurs - -* au sujet pragma: - ex : %ASSUME:assumeSelectElementOfRank_inArray_% - je les ai rajouté (un peu) dans le parseurs - -> 3 shift/reduce conflicts ! - et puis il faut que je les mettre partout -> changer une autre - regle ? sxIdent ? +* Recursion statique +la recursion statique ne marche pas ("with (n=1)" pas pris en compte) -* test/should_work/Pascal/consensus.lus - -la recursion statique ne marche pas ("with (n=1)" pas pris en compte - +../lus2lic should_work/Pascal/consensus.lus +../lus2lic should_work/Pascal/t2.lus +../lus2lic should_work/Pascal/t0.lus node consensus<<const n : int>>(T: bool^n) returns (a: bool); let @@ -183,7 +155,7 @@ tel * evalEq.translate_left_part : faire plus de verification sur les -index de slice +index de slice * patcher le mode emacs - rajouter modele, package, etc. @@ -201,6 +173,9 @@ c'est pas fini !) du genre "[int,int]" voire meme "[int,real]" qui ne sont plus autorisé, mais à qui on pourrait donner du sens via des tableaux et des structures factices +* verifier que chacun des exemples du repertoire "should_fail" à une +correspondance dans le manuel, et reciproquement... + * "extern", "unsafe", and "memoryless" annotations diff --git a/src/expandPack.ml b/src/expandPack.ml index 22176024..90ccf26d 100644 --- a/src/expandPack.ml +++ b/src/expandPack.ml @@ -1,4 +1,4 @@ -(** Time-stamp: <modified the 27/05/2008 (at 10:06) by Erwan Jahier> *) +(** Time-stamp: <modified the 29/05/2008 (at 14:17) by Erwan Jahier> *) open Lxm open SyntaxTree @@ -7,7 +7,7 @@ open Errors open SyntaxTabUtils let (doit: - (Ident.t, SyntaxTree.model_info Lxm.srcflagged) Hashtbl.t -> + (Ident.t, SyntaxTree.model_info Lxm.srcflagged) Hashtbl.t -> (SyntaxTree.pack_info Lxm.srcflagged) -> SyntaxTree.pack_given) = fun mtab pdata -> ( @@ -37,75 +37,85 @@ let (doit: let args = pi.pi_args in let pars = mi.it.mo_needs in (*--------------------------------------------------*) - (* la fonction qui traite un couple ... *) - let check_arg p a = ( - (* message d'erreur standard *) - let instance_error () = ( - let msg = Printf.sprintf - "bad pack instance: uncompatible arg passed to %s" - (Lxm.details p.src) + + (* la fonction qui traite un couple ... *) + let (check_arg : static_param srcflagged -> static_arg srcflagged -> unit) = + fun param arg -> + (* message d'erreur standard *) + let instance_error () = + let msg = Printf.sprintf + "bad argument in package instance: %s" (Lxm.details param.src) + in + raise (Compile_error (arg.src, msg)) in - raise (Compile_error (a.src, msg)) - ) in - (* on a soit un ident, à checker plus tard, - soit une expression de la bonne nature *) - match (p.it) with - | StaticParamType s -> ( - let te = match (a.it) with - StaticArgIdent idr -> - Lxm.flagit (Named_type_exp idr) a.src - | StaticArgType x -> x - | _ -> instance_error () - in - let ti = AliasedType (s, te) in - let x = Lxm.flagit (TypeInfo ti) p.src in - newprov := x::!newprov ; - let y = Lxm.flagit ti p.src in - put_in_tab "type" ttab s y ; - newdefs := (TypeItem s)::!newdefs - ) - | StaticParamConst (s,te) -> ( - let ce = match (a.it) with - | StaticArgIdent idr -> - ParserUtils.leafexp a.src (IDENT_n idr) - | StaticArgConst x -> x - | _ -> instance_error () - in - let ci = DefinedConst (s, Some te, ce) in - let x = Lxm.flagit (ConstInfo ci) p.src in - newprov := x::!newprov ; - let y = Lxm.flagit ci p.src in - put_in_tab "const" ctab s y ; - newdefs := (ConstItem s)::!newdefs - ) - | StaticParamNode (s, inl, outl, has_memory) -> ( - let by_pos_op = match (a.it) with - | StaticArgIdent idr -> - ParserUtils.call_or_predef(Lxm.flagit ((idr,[])) a.src) - | StaticArgNode by_pos_op -> by_pos_op - | _ -> instance_error () - in - let sparams = [] in - let ni = { - name = s; - static_params = sparams; - vars = Some (ParserUtils.build_node_var inl outl None); - def = Alias (flagit by_pos_op a.src); - has_mem = has_memory; - 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 := (NodeItem (s,sparams))::!newdefs - ) - ) (* check_arg *) + (* on a soit un ident, à checker plus tard, soit une + expression de la bonne nature *) + match (param.it) with + | StaticParamType s -> ( + let te = match (arg.it) with + StaticArgIdent idr -> + Lxm.flagit (Named_type_exp idr) arg.src + | StaticArgType x -> x + | _ -> instance_error () + in + let ti = AliasedType (s, te) in + let x = Lxm.flagit (TypeInfo ti) param.src in + newprov := x::!newprov ; + let y = Lxm.flagit ti param.src in + put_in_tab "type" ttab s y ; + newdefs := (TypeItem s)::!newdefs + ) + | StaticParamConst (s,te) -> ( + let ce = match (arg.it) with + | StaticArgIdent idr -> + ParserUtils.leafexp arg.src (IDENT_n idr) + | StaticArgConst x -> x + | _ -> instance_error () + in + let ci = DefinedConst (s, Some te, ce) in + let x = Lxm.flagit (ConstInfo ci) param.src in + newprov := x::!newprov ; + let y = Lxm.flagit ci param.src in + put_in_tab "const" ctab s y ; + newdefs := (ConstItem s)::!newdefs + ) + | StaticParamNode (s, inl, outl, has_memory) -> ( + let by_pos_op = match (arg.it) with + | StaticArgIdent idr -> + ParserUtils.call_or_predef(Lxm.flagit ((idr,[])) arg.src) + | StaticArgNode by_pos_op -> by_pos_op + | _ -> instance_error () + in + let sparams = [] in + let ni = { + name = s; + static_params = sparams; + vars = Some (ParserUtils.build_node_var inl outl None); + def = Alias (flagit by_pos_op arg.src); + has_mem = has_memory; + is_safe = true; + } + in + let x = Lxm.flagit (NodeInfo ni) param.src in + newprov := x::!newprov ; + let y = Lxm.flagit ni param.src in + put_in_tab "node" otab s y ; + newdefs := (NodeItem (s,sparams))::!newdefs + ) + (* check_arg *) in + let pars_nb = string_of_int (List.length pars) + and args_nb = string_of_int (List.length args) in try ( (*------------TRAITEMENT---------------------------------*) - assert (List.length pars = List.length args); + if (pars_nb <> args_nb) then + raise(Compile_error + (pdata.src, + ("\n*** " ^pars_nb ^ + " arguments are expected, but "^args_nb^ + " were provided when defining package "^ + (Ident.pack_name_to_string pdata.it.pa_name) + ))); List.iter2 check_arg pars args; (* on fabrique un pack_given valide avec les infos récoltées *) let body = { diff --git a/src/parser.mly b/src/parser.mly index aee830a2..18a14fbb 100644 --- a/src/parser.mly +++ b/src/parser.mly @@ -615,12 +615,17 @@ sxUses: } ; +/* */ +sxEq_or_Is: +| TK_EQ + {} +| TK_IS + {} /* I don't like by-pos notation, but keep it for backward compatibility */ - sxPackEq: - TK_PACKAGE sxIdent TK_IS sxIdent TK_OPEN_PAR + TK_PACKAGE sxIdent sxEq_or_Is sxIdent TK_OPEN_PAR sxStaticArgList TK_CLOSE_PAR TK_SEMICOL { @@ -1178,7 +1183,8 @@ sxStaticArgList: - la nature est sans ambiguite const (expressions simples) - la nature est compile-time (juste un ident, a résoudre) */ - sxStaticArg: + +sxStaticArg: /* nature explicite */ | TK_TYPE sxType { {src=$1 ; it=StaticArgType $2 } } diff --git a/src/syntaxTab.ml b/src/syntaxTab.ml index d5cc6c96..5d631511 100644 --- a/src/syntaxTab.ml +++ b/src/syntaxTab.ml @@ -1,4 +1,4 @@ -(** Time-stamp: <modified the 26/05/2008 (at 11:29) by Erwan Jahier> *) +(** Time-stamp: <modified the 29/05/2008 (at 13:56) by Erwan Jahier> *) (** Table des infos sources : une couche au dessus de SyntaxTree pour mieux @@ -302,7 +302,7 @@ init_pack_mng_stabs (this: t) (pname: Ident.pack_name) (pm: pack_mng) = ( Verbose.printf " init symbol tables for pack %s\n" (Ident.pack_name_to_string pname); (* ON COMMENCE PAR TRAITER LE PG_USES *) - let treat_uses px = ( + let treat_uses (px:Ident.pack_name srcflagged) = ( let pname = px.it in let lxm = px.src in let pum = diff --git a/src/test/should_work/Pascal/t0.lus b/src/test/should_work/Pascal/t0.lus index 938bc043..f213d459 100644 --- a/src/test/should_work/Pascal/t0.lus +++ b/src/test/should_work/Pascal/t0.lus @@ -7,12 +7,11 @@ let mn = if (x <= y) then x else y; tel -node min_n<<const n: int>> -(T : int^n) returns (mn : int); +node min_n<<const n: int>>(T : int^n) returns (mn : int); let mn = with (n = 1) then T[0] - else min(T[0], min_n<<n-1>>(T[1 ..n-1])); + else min(T[0], min_n<<n-1>>(T[1 .. n-1])); tel node min_4 = min_n<<4>>; - +node t0 = min_4; diff --git a/src/test/should_work/Pascal/t2.lus b/src/test/should_work/Pascal/t2.lus index 3920f79e..307043da 100644 --- a/src/test/should_work/Pascal/t2.lus +++ b/src/test/should_work/Pascal/t2.lus @@ -42,6 +42,7 @@ let c = fold_left << bool,bool,6, Lustre::and >>(true, X); tel +node t2 = consensus_6; -- Voire même : node consensus_6_bis = fold_left << bool,bool,6, Lustre::and >> ; diff --git a/src/test/should_work/demo/mapiter_lv4.lus b/src/test/should_work/demo/mapiter_lv4.lus deleted file mode 100644 index a415d6ee..00000000 --- a/src/test/should_work/demo/mapiter_lv4.lus +++ /dev/null @@ -1,45 +0,0 @@ --------------------------------------------- --- File `mapiter_lv4.lus' generated by --- the lustre-v6 compiler version 0.17 --------------------------------------------- - --------------------------------------------- --- internal type(s) definition(s) --------------------------------------------- -type T1_ARRAY = int^7; -type T2_ARRAY = T1_ARRAY^3; - --------------------------------------------- --- alias types and constant declarations --------------------------------------------- - --------------------------------------------- --- operator definition --------------------------------------------- -node mapiter( - i_i1 : T2_ARRAY; - ) returns ( - o_s1 : T2_ARRAY; - ); -let - o_s1 = m_m_incr_tab_7_3(i_i1); -tel - - ----------------------------------------------- --- V6-iterators traduction ----------------------------------------------- - --- node: m_incr_tab_7 ------------------------------------- -node m_incr_tab_7(i0 : T1_ARRAY) returns (o0 : T1_ARRAY); -let - o0 = incr_tab(i0); -tel - --- node: m_m_incr_tab_7_3 ------------------------------------- -node m_m_incr_tab_7_3(i0 : T2_ARRAY) returns (o0 : T2_ARRAY); -let - o0 = m_incr_tab_7(i0); -tel diff --git a/src/test/should_work/packEnvTest/Condact.lus b/src/test/should_work/packEnvTest/Condact.lus index d7a69b34..533fb6d6 100644 --- a/src/test/should_work/packEnvTest/Condact.lus +++ b/src/test/should_work/packEnvTest/Condact.lus @@ -8,7 +8,7 @@ -- Generic Package Condact ------------------------------------- -package Main +package Util provides node carre(e: int) returns (s: int); body node carre(e: int) returns (s: int); @@ -18,13 +18,13 @@ body end -package TestCondact uses Main; - = Condact(int, int, Main::carre); +package TestCondact = Condact(int, int, Util::carre); model Condact needs - type t1, t2; + type t1; + type t2; node n(x: t1) returns (y: t2); provides node C(c: bool; d: t2; x: t1) returns (y: t2); @@ -39,3 +39,10 @@ end +package Main +uses TestCondact; +provides + node Condact(c: bool; d: t2; x: t1) returns (y: t2); +body + node Condact = TestCondact::C; +end \ No newline at end of file diff --git a/src/test/test.res.exp b/src/test/test.res.exp index c259dab4..4a3f52ee 100644 --- a/src/test/test.res.exp +++ b/src/test/test.res.exp @@ -6138,6 +6138,7 @@ Opening file should_work/Pascal/t0.lus *** SyntaxTab.create pass 2 init pack t0 export node min_4 + export node t0 export node min export node min_n export node max @@ -6158,7 +6159,7 @@ End of Syntax table dump. Exported types: Exported constants: Exported nodes: -*** Error in file "should_work/Pascal/t0.lus", line 14, col 39 to 40, token '..': +*** Error in file "should_work/Pascal/t0.lus", line 13, col 39 to 40, token '..': *** can't eval constant: array index 1 out of bounds 0..0 @@ -6196,6 +6197,7 @@ Opening file should_work/Pascal/t2.lus *** SyntaxTab.create pass 2 init pack t2 export node fold_left + export node t2 export node consensus_6_bis export node consensus_6 export node consensus_bis @@ -7952,39 +7954,6 @@ let tel -- end of node mapiter__mapiter ----------------------------------------------------------------------- -====> ../lus2lic -vl 3 --compile-all-items should_work/demo/mapiter_lv4.lus -Opening file should_work/demo/mapiter_lv4.lus -*** SyntaxTab.create pass 1 -*** SyntaxTab.create pass 2 - init pack mapiter_lv4 - export type T1_ARRAY - export type T2_ARRAY - export node mapiter - export node m_m_incr_tab_7_3 - export node m_incr_tab_7 -*** SyntaxTab.create pass 3 - init symbol tables for pack mapiter_lv4 -*** SyntaxTab.create done -*** « Syntax table dump: - - Package or model list: - mapiter_lv4 (pack) - - - Raw model table: - - Raw Package table: mapiter_lv4 - - Package manager table: mapiter_lv4 -End of Syntax table dump. » --- MAIN NODE: "mapiter_lv4__mapiter_lv4" -*** Dump the exported items of the packages. - * package mapiter_lv4 - Exported types: -type mapiter_lv4__T1_ARRAY = int^7; -type mapiter_lv4__T2_ARRAY = int^7^3; - Exported constants: - Exported nodes: -*** Error in file "should_work/demo/mapiter_lv4.lus", line 37, col 8 to 15, token 'incr_tab': unknown node (incr_tab) - - ---------------------------------------------------------------------- ====> ../lus2lic -vl 3 --compile-all-items should_work/demo/mappredef.lus Opening file should_work/demo/mappredef.lus @@ -13180,7 +13149,51 @@ tel ---------------------------------------------------------------------- ====> ../lus2lic -vl 3 --compile-all-items should_work/packEnvTest/Condact.lus Opening file should_work/packEnvTest/Condact.lus -*** Error in file "should_work/packEnvTest/Condact.lus", line 22, col 3 to 3, token '=': syntax error +*** SyntaxTab.create pass 1 +*** SyntaxTab.create pass 2 + init pack Main + export node Condact + init pack TestCondact + export node C + export type t1 + export type t2 + export node n + init pack Util + export node carre +*** SyntaxTab.create pass 3 + init symbol tables for pack Main + init symbol tables for pack TestCondact + init symbol tables for pack Util +*** SyntaxTab.create done +*** « Syntax table dump: + - Package or model list: + Util (pack) + TestCondact (pack) + Condact (model) + Main (pack) + + - Raw model table: Condact + - Raw Package table: Main TestCondact Util + - Package manager table: Main TestCondact Util +End of Syntax table dump. » +-- MAIN NODE: "Util__Condact" +*** Dump the exported items of the packages. + * package Util + Exported types: + Exported constants: + Exported nodes: +node Util__carre(e:int) returns (s:int); +let + s = (e * e); +tel +-- end of node Util__carre + * package TestCondact + Exported types: +type TestCondact__t1 = int; +type TestCondact__t2 = int; + Exported constants: + Exported nodes: +*** Error in file "should_work/packEnvTest/Condact.lus", line 21, col 42 to 52, token 'Util::carre': unknown node (carre) ---------------------------------------------------------------------- -- GitLab