Je suis en train de créer un analyseur pour analyser un petit AST généré par un de mes projets, et avant de trop l'entamer, j'aimerais avoir quelques conseils concernant le type checking ou l'analyseur de contexte, c'est-à-dire savoir analyser quelque chose comme ceci par exemple :
type size_t = unsigned myint;
size_t main(int argc, char *argv[]) {
if (argc > 10) {
bool test = true;
}
else {
test = false;
}
int argc = 10;
return argc;
}
Et qu'il me trouve ces erreurs :
type 'myint' non définit ;
variable 'test' non définit dans son contexte ;
redéfinition de la variable 'argc' ;
'main()' est du type 'size_t' mais renvoie une valeur du type 'int'.
Par exemple.
Je ne sais pas du tout comment m'y prendre.
Si vous avez des idées, (concernant n'importe quel langage, c'est surtout le principe qu'il me faudrait), je suis preneur !
Je vous remercie, bonne journée
- Edité par Geralt de Riv 11 novembre 2018 à 0:56:46
Tu définis la notion de contexte qui stocke la liste les symboles connus dans chaque catégorie (type, variable, etc), et tu maintiens une pile de contextes qui va en gros être mise à jour à chaque création/destruction d'un bloc.
- Edité par Ksass`Peuk 12 novembre 2018 à 11:12:04
Je ne pense pas que distinguer variables et fonction soit vraiment intéressant, une fonction c'est juste une variable qu'on peut appliquer. Et je vois pas l'intérêt d'une map non plus. Reste sur des vectors. Le contexte en cours c'est .back(), et celui d'avant, c'est n-2, etc. Et quand ton bloc se termine, tu as juste à pop_back().
- Edité par Ksass`Peuk 12 novembre 2018 à 18:40:22
Je ne pense pas que distinguer variables et fonction soit vraiment intéressant, une fonction c'est juste une variable qu'on peut appliquer.
?
let a = 42 // a: int
let f b = b + 1 // f: int -> int
let g c = c // g: 'a -> 'a
Et en général, on prendrait un type somme du genre :
type typ = Int | Float | ... | TFun(typ * typ)
Et du coup, une variable c'est juste un nom et un type avec une définition qui doit correspondre à ce type (définition qui devient juste une expression). Du coup, après, quand tu as :
f 42
Il faut juste que tu vérifies que f à un type TFun qui reçoit un Int comme premier paramètre (et qui peut potentiellement être à nouveau une fonction derrière, etc.
Geralt de Riv a écrit:
Donc je n'ai pas besoin de sauvegarder tout les contextes ? Et c'est quoi n-2 ?
Je reviens un peu sur les variables, est-ce que leur valeur doit aussi être sauvegardées pour le type-checking, ou simplement le type et le nom de celles-ci sont nécessaires ?
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C
Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C
Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C
Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C
Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C
Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C