Bonjour tout le monde,
J'espère que vous allez bien ! Alors, en fait, j'essaie d'écrire une fonction qui prend une chaîne de caractère ( qui sera en soi le contenu d'un fichier dans l'application) et l'évalue puis me retourne un tableau contenant les erreurs, les warning..etc et l'arbre de syntaxe abstraite. Pour faire cela, il y'a ces quelques fonctions que je vois qui peuvent m'être utiles :
- eval_decls_toplevel (dans eval.ml) - eval_expr_str ( dans elab.ml ) - eval_decl_str ( dans elab.ml ) - lexp_p_decls ( dans elab.ml ) - lexp_decl_str ( dans elab.ml ) - lexp_expr_str ( dans elab.ml )
Alors j'ai deux questions : - Que représente la liste des "tokens" que prend en paramètre la fonction lexp_p_decls ? - Le contexte qui est utilisé par eval_decls_toplevel en paramètre, c'est le contexte d'élaboration ( ectx)?
Merci beaucoup, bien à vous !
Afficher les réponses par date
J'espère que vous allez bien ! Alors, en fait, j'essaie d'écrire une fonction qui prend une chaîne de caractère ( qui sera en soi le contenu d'un fichier dans l'application) et l'évalue puis me retourne un tableau contenant les erreurs, les warning..etc et l'arbre de syntaxe abstraite. Pour faire cela, il y'a ces quelques fonctions que je vois qui peuvent m'être utiles :
- eval_decls_toplevel (dans eval.ml)
- eval_expr_str ( dans elab.ml )
- eval_decl_str ( dans elab.ml )
- lexp_p_decls ( dans elab.ml )
- lexp_decl_str ( dans elab.ml )
- lexp_expr_str ( dans elab.ml )
Dans `raw_eval` on utilise `Elab.lexp_p_decls`, donc c'est probablement un bon choix ;-)
Alors j'ai deux questions :
- Que représente la liste des "tokens" que prend en paramètre la
fonction lexp_p_decls ?
Ça représent les "lexèmes" qu'a trouvé l'analyseur lexical. Dans `raw-eval` la fonction `f` est une fonction qui fait une phase de "pré-analyse lexicale", qui consiste à reconnaître fondamentalement les commentaires et les chaînes de caractères. Ensuite on passe ça à `lex` qui découpe ce qui reste en lexèmes (l'équivalent des "mots" et des éléments de ponctuation dans les languaes naturelles).
Dans `lexp_p_decls`, on appelle l'analyseur lexical via `sexp_parse_all` pour transformer cette liste de tokens en une Sexp (une représentation qui comprend la structure syntaxique, en peu comme du JSON ou du XML) et ensuite analyse cette structure pour y reconnaître des définitions, des déclarations des appels de fonctions, ...
- Le contexte qui est utilisé par eval_decls_toplevel en paramètre, c'est
le contexte d'élaboration ( ectx)?
Non, dans `raw_eval` tu peux voir qu'on y passe le `rctx`. C'est aussi visible indirectement dans le fait que ça reçoit une `elexp`, donc une lambda-expression où les types ont été effacé, donc l'information qui existait dans le `ectx` (qui est principalement utilisé pour inférer les annotations de types "manquantes") n'y serait plus très utile.
Stefan
((vname * lexp * ltype) list list * elab_context)
Ce type décrit une liste de listes de déclarations, combinée à un context d'élaboration (qui devrait être le résultat de la combinaison du contexte d'entrée avec les déclaration renvoyées).
Il s'agit s'une liste de listes, parce que dans
x = 1;
odd x = ... even y ...; even x = ... odd y ...;
add x = x + 1;
il y a 3 parties: la déclaration de `x` suivis des déclarations simultanées de `even` et `odd` suivies de la déclaration de `add`. Donc un fichier va correspondre à un liste de déclarations séquentielles, ou chaque élément est un eliste (non vide) de déclarations simultanées (qui permet la récursion mutuelle).
Chaque déclaration est représentée par le triplet (vname * lexp * ltype) où le premier élément donne le nom (utilisé seulement à but de débogage), le deuxième donne la définition elle même et le troisième donne le type de cette définition. Donc pour la première ligne ci-dessus on pourrait avior qqch équivalent à (Some "x", Imm 1, Builtin Int).
Stefan