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