• [^] # Re: Méconnaissance

    Posté par (site web personnel) . En réponse au journal Compilateur et Monad Reader. Évalué à 3.

    Personnellement je ferai tout à l'intérieur d'une fermeture, comme l'évoquait lasher :

    Je donne ici le squelette, à compléter bien sûr pour chaque token. Chaque fonction retournant unit (elle modifie l'environnement), et la fonction compile est récursive puisqu'elle pour traiter la liste des instructions jusqu'à la fin :

    open Cparse
    let rec compile out declarations =
     (** Les fonctions terminales : ne dépendent pas d'un autre fonction de mise en
     forme *)
     let print_operator var = function
     | M_MINUS -> Printf.fprintf out "-%s" var
     | M_NOT -> Printf.fprintf out "~%s" var
     | M_POST_INC -> Printf.fprintf out "%s++" var
     | M_PRE_INC -> Printf.fprintf out "++%s" var
     | M_POST_DEC -> Printf.fprintf out "%s--" var
     | M_PRE_DEC -> Printf.fprintf out "--%s" var
     and print_pred var = function
     | S_MUL -> ()
     | S_DIV -> ()
     | S_MOD -> ()
     | S_ADD -> ()
     | S_SUB -> ()
     in
     (** Fonctions de mise en forme qui dépendent de celles déclarées ci-dessus *)
     (** Traite les déclarations *)
     let parse_declaration declaration loc = ()
     (** Traite les fonctions *)
     and parse_function loc st declarations code = ()
     in
     (** Point d'entrée du printer *)
     begin match declarations with
     | [] -> ()
     | Cparse.CDECL (declaration, loc)::tl -> parse_declaration declaration loc; compile out tl
     | Cparse.CFUN (loc, st, declarations, code)::tl -> parse_function loc st declarations code; compile out tl
     end