IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Caml Discussion :

Probleme avec la fonction open_in


Sujet :

Caml

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Probleme avec la fonction open_in
    Bonjour, j'ai un probleme avec la fonction open_in,
    voila mon code caml :

    let chaine = "#include \"fichier.txt\"";;

    let fichier = String.sub chaine 10 ( (String.length chaine) - 11);;

    let channel = open_in fichier;;

    let buffer = Lexing.from_channel channel;;
    ce qui donne dans emacs:

    # let chaine = "#include \"fichier.txt\"";;
    val chaine : string = "#include \"fichier.txt\""

    # let fichier = String.sub chaine 10 ( (String.length chaine) - 11);;
    val fichier : string = "fichier.txt"

    # let channel = open_in fichier;;
    val channel : in_channel = <abstr>

    # let buffer = Lexing.from_channel channel;;
    val buffer : Lexing.lexbuf =
    {Lexing.refill_buff = <fun>;
    Lexing.lex_buffer =
    "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000";
    Lexing.lex_buffer_len = 0; Lexing.lex_abs_pos = 0;
    Lexing.lex_start_pos = 0; Lexing.lex_curr_pos = 0;
    Lexing.lex_last_pos = 0; Lexing.lex_last_action = 0;
    Lexing.lex_eof_reached = false; Lexing.lex_mem = [||];
    Lexing.lex_start_p =
    {Lexing.pos_fname = ""; Lexing.pos_lnum = 1; Lexing.pos_bol = 0;
    Lexing.pos_cnum = 0};
    Lexing.lex_curr_p =
    {Lexing.pos_fname = ""; Lexing.pos_lnum = 1; Lexing.pos_bol = 0;
    Lexing.pos_cnum = 0}}
    mon fichier texte est bien dans le dossier courant, et contient la chaine de caracteres "bonjour"

    pourquoi mon lexeur est-il vide ? merci d'avance pour votre aide

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    C'est normal : le remplissage d'un Lexing.lexbuf est paresseux, il se fait à la demande. En théorie tu n'as pas à manipuler ce type directement, ça s'utilise dans les lexeurs générés par ocamllex, et ils font ça pour toi. Si tu veux le remplir explicitement il faut demander :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    buffer.Lexing.refill_buffer buffer;;
    Tu peux regarder la documentation du module Lexing:
    http://caml.inria.fr/pub/docs/manual...ef/Lexing.html

    Je ne sais pas ce que tu essaies de faire, mais ça m'a l'air très louche : parser mochement des directives #include, manipuler un lexbuf... Tu es sûr qu'il n'y a pas un moyen plus simple d'arriver à tes fins ?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Effectivement cela fonctionne,

    je testais seulement les fonctions sous emacs mais en réalité j'écris un fichier ocamllex, qui a pour but d'afficher le contenu d'un fichier c, mais aussi celui des fichiers inclus (repérés pars les directives #include "fichier.h" par exemple)

    voila ce que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    { 
      exception Eof
    }
     
     
    rule lexeur = parse
      | "#include \"" [ 'A'-'Z' 'a'-'z' '0'-'9' '.']* "\"\n" 
    	as mot { 
    		let file  = String.sub mot 10 ((String.length mot) - 12) in
    			let chnl = open_in file in 
    				let buf = Lexing.from_channel chnl in
    					buf.Lexing.refill_buff buf;
     
    		print_char '\n'
    	 }
      | _ as c { print_char c }
      | eof { raise Eof }
     
     
    {
     
      let lexbuf = Lexing.from_channel stdin in
        try
          while true do
            lexeur lexbuf
          done
        with Eof -> ()
     
     
    }
    j'aimerai savoir comment effectuer une récursion de la règle sur les sous fichiers

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    Je trouve l'idée amusante, mais je ne comprends pas l'utilité du refill_lexbuf ici (ou ailleurs).

    Voici ce que j'ai fait pour lire un fichier entier (j'utilise une règle bidon qui ne matche rien, pour pouvoir profiter de la récursivité entre les règles). Je n'ai testé que très sommairement mais ça a l'air de marcher (et c'est presque étonnant).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    { 
      exception Eof
    }
     
    rule lexeur = parse
      | "#include \"" [ 'A'-'Z' 'a'-'z' '0'-'9' '.']* "\"\n" 
    	as mot {
              Scanf.sscanf "#include \"%s\""
              (fun file ->
                let chnl = open_in file in 
    	    let buf = Lexing.from_channel chnl in
                full_file buf;
    	    print_newline ()
              )
    	}
      | _ as c { print_char c }
      | eof { raise Eof }
     
    and full_file = parse
      | "" {
        begin
          try
            while true do
              lexeur lexbuf
            done
          with Eof -> ()
        end
        }
     
    {
     
      let lexbuf = Lexing.from_channel stdin in
      full_file lexbuf  
    }

Discussions similaires

  1. Probleme avec la fonction Ontimer
    Par Djule dans le forum MFC
    Réponses: 8
    Dernier message: 27/11/2005, 17h52
  2. Probleme avec la fonction rename()
    Par TheZenZen dans le forum C
    Réponses: 6
    Dernier message: 08/10/2005, 15h59
  3. [LG] Problème avec la Fonction ReadLn en fin de programme
    Par killermano dans le forum Langage
    Réponses: 6
    Dernier message: 23/07/2005, 15h16
  4. [LG]Probleme avec une fonction
    Par xavier1936 dans le forum Langage
    Réponses: 7
    Dernier message: 08/02/2005, 22h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo