-
Erwan Jahier authored
in the nonreg tests. They are currently ignored. Moreover, they should be added at other places (or maybe handled differently).
Erwan Jahier authoredin the nonreg tests. They are currently ignored. Moreover, they should be added at other places (or maybe handled differently).
TODO 7.06 KiB
*** questions
* dans le generateur de lic, comment imprimer le nom des packages ?
- Pack::toto -> pas du vieux lustre (donc pas reentrant)
- Pack__toto -> name clash (si un ident local s'appelle comme ca)
- _Pack__toto -> pas beau, rend lus2lic pas idempotent
- _4Pack__toto -> encore moins beau, pas idempotent
* instanciation de package <<locaux>> à d'autre package interdite
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...
* slice_info_eff width = size ? Le commentaire dit
S[i] = A[first + i*step] pour i = 0 .. width
mais j'ai l'impression que ce devrait etre
S[i] = A[first + i*step] pour i = 0 .. (width-1)
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,
const right = pi/2.;
est evalué (+ warning) alors qu'on ne devrait pas je trouve.
-> à discuter
par exemple, pour les comparaisons, c'est ok à la limite. mais pour
les operateurs aritmetiques, bof.
* pour l'evaluation statique de l'egalité, j'ai pas fait pareil...
-> à discuter (cf predefInfo.ml)
o Lazycompiler.solve_x_idref
Comment se faisse que je n'ai pas besoin de me servir de cet
x_info ????? En fait, je devrais le passer en argument de x_check,
car celui ci en a besoin et je suis obligé de faire un match find_x
with | Imported -> assert false | Local x_info -> ... pour le
recuperer ce qui est extremement laid...
-> TODO : rajouter x_info en argument de x_check (et virer symbols du
coup eventuellement ?)
log:
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...).
* essayer de faire qque chose pour les 2 verrues dans predefSemantics
* maintenant que je peux definir des trucs du genre
x = map<<+;3>>
ai-je encore besoin de Lustre::plus et consort ???
***********************************************************************************
***********************************************************************************
***********************************************************************************
***********************************************************************************
*** a faire
*** facile
* autoriser le fait le pouvoir donner une valeur par defaut à une
constante exportée. («provides const : n = 4; »)
-> cf test/should_work/Pascal/packs.lus
* ../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"
au lieu de
"1" ".." "2"
et avec lex, il n'y a aucun moyen de lever cette ambiguité !
une solution crade serait de faire un coup des sed pour rajouter un
espace devant tous les "..".
une solution propre serait de ne plus utiliser lex... Une autre
solution serait de reconstruire la bonne onfo au niveau du yacc. Par
exemple, si apres un "[", on trouve un reel, on bidouille pour
generer les lexemes qui vont bien, à savoir :
tk_real+tk_real -> tk_int+tk_dotdot+tk_int
* Dans les messages d'erreurs, le numero de colonne est faux à cause des tabulations
* Verifier que les fonctions sont des fonctions etc.
*** moins facile
* le clock checking
* le merge
* les itérateurs
* test/should_work/Pascal/consensus.lus
la recursion statique ne marche pas ("with (n=1)" pas pris en compte
node consensus<<const n : int>>(T: bool^n) returns (a: bool);
let
a = with (n = 1)
then T[0]
else T[0] and consensus << n-1 >> (T[1..n-1]);
tel
* evalEq.translate_left_part : faire plus de verification sur les
index de slice
* parser.mly : rajouter les pragma !
ex : %ASSUME:assumeSelectElementOfRank_inArray_%
-> 3 shift/reduce conflicts !
* patcher le mode emacs
- rajouter modele, package, etc.
- l'indentation est vraiment à chier
* finir de rédiger le manuel
+ verifier que j'y parle bien de la priorite des operateurs
* Essayer de tronconner le lazyCompiler, 700 lignes, c'est trop (et
c'est pas fini !)
* implementer une option --old-style-syntax pour faire quelque chose des trucs
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
* "extern", "unsafe", and "memoryless" annotations
Rajouter ces 3 mots clefs dans la syntaxe.
L'idée, c'est que par defaut, un noeud lustre est
- interne (i.e., pas extern, cad défini en Lustre)
- safe (i.e., pas d'effet de bord)
- memoryfull (i.e., ils utilisent de la mémoire)
on pourra rajouter l'alias
function == extern memoryless node
pour la compatibilité ascendente
bon, non en fait, il n'y a pas besoin de rajouter tous ces mots clefs.
o memoryless -> function, qui existe deja
o extern -> y'a rien besoin de dire : on regarde juste s'il y a un
corps ou pas
o unsafe -> la, oui, il faut un mot clef. on y fera plus
tard. Plus precisement, on verifie la cohérence de declarations
avec ce qui est généré, puis on transmet l'info telle quelle à
lic si tout est correct.
nb : pour les noeuds «internes», on peut se passer de d'indiquer
qu'il s'agit d'une "function", qui est "unsafe" dans la mesure où on
sait toujours inferer ces infos. Mais laisser les gens le mettre
s'ils le veulent, ca ne mange pas de pain.
nb2 : rejeter les noeuds sans memoire (ce faisant sans indiquer
"function", ca ne serait pas backward compatible. Mais on pourrait
alors rajouter l'option --infer-memoryless-annotation). Ou alors, on
se contente d'emmettre des warning.
nb3 : function = memoryless node