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 :

transformer une chaine de caractere en liste


Sujet :

Caml

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 10
    Points : 5
    Points
    5
    Par défaut transformer une chaine de caractere en liste
    Bonjour

    je voudrais savoir s'il existe une fonction qui transforme une chaine de caractere en liste
    par exemple si j'ai "[1;2]" j'aimerai avoir [1;2]

    merci d'avance

  2. #2
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    Non, mais tu peux le faire toi-même.

    Pourquoi veux-tu faire une fonction aussi tordue et compliquée ?
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    mon programme contient une interface MSDOS avec l'utilisateur.

    supposons que l'on veuille calculer la longueur d'une liste donnée par l'utilisateur
    Par exemple l'utilisateur entre la liste [1;2], le probleme c'est que le programme considere [1;2] comme une chaine de caractere et non pas une liste.

    C'est pourquoi j'ai besoin de transformer ma chaine de caractere en liste

  4. #4
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Généralement, sauf si tu es un sadique, tu demanderas plutôt à ton utilisateur de t'écrire une liste sous la forme "1, 2" ou même "1 2", nettement plus facile à écrire (et accessoirement à parser).
    Si tu utilisais Haskell il te suffirait d'utiliser la fonction "read" mais puisque tu es sous OCaml, je pense qu'il va falloir écrire toi-même le découpage de la string en liste de string et ensuite utiliser "List.map int_of_string" ou quelque chose comme ça.

    --
    Jedaï

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    pour etre plus precis je manipule une liste d'un type que j'ai defini : le type formule qui se de decompose ainsi

    type formule = Arrobase of int*formule | P of string | Et of formule*formule | ... ;;

    donc si l'utilisateur entre "Arrobase(1,Et(P("p"),P("q")))" j'aimerai avoir [Arrobase(1,Et(P("p"),P("q")))]

  6. #6
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut
    C'est un cas typique de l'utilisation du module Lex.
    La source du module: ici.
    L'explication détaillée de son utilisation: .

    Voici à quoi ressemblerait le code pour parser une liste d'entiers (avec détection et rapport d'erreur) :

    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
    let lex = Lex.make stdin
    
    in let read_until l =
      let a = Lex.demand_int() in
      if Lex.granted_mono ';' then read_until (a::l) 
      else a::l
    
    in let read_list () =  
      try
        Lex.demand_mono '[';
        let result = read_until [] in
        Lex.demand_poly "];;";
        List.rev result
      with
      | Lex.Demand_denied(position,demand) ->
          Lex.print_position position;
          Lex.print_denied demand;
    
    in read ()
    Je suis certain que tu trouveras au chapitre VII assez d'explications pour étendre le code ci-dessus à l'analyseur que tu souhaites
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 99
    Points : 93
    Points
    93
    Par défaut
    Citation Envoyé par neo666 Voir le message
    pour etre plus precis je manipule une liste d'un type que j'ai defini : le type formule qui se de decompose ainsi

    type formule = Arrobase of int*formule | P of string | Et of formule*formule | ... ;;

    donc si l'utilisateur entre "Arrobase(1,Et(P("p"),P("q")))" j'aimerai avoir [Arrobase(1,Et(P("p"),P("q")))]
    Pourquoi si tu programmes en OCaml ne pas demander plutôt une string du type :
    "Arrobase 1 (Et (P "p") (P "q"))"

    et apès tu pourrais trouver ton bonheur avec OCamlLex et OCamlYacc

  8. #8
    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
    Pourquoi ne pas tout simplement lui demander d'utiliser le toplevel ?

  9. #9
    alex_pi
    Invité(e)
    Par défaut
    Citation Envoyé par bluestorm Voir le message
    Pourquoi ne pas tout simplement lui demander d'utiliser le toplevel ?
    Soit tu veux faire une interface agreable ou l'utilisateur peut taper 1@P("p") & Q("q") auquel cas tu n as pas d'autre choix que de passer par un lexeur/parseur (a la main ou avec les outils tout fait, c est au choix), soit tu veux qu'il le tappe directement avec la syntaxe du top level, auquel cas autant utiliser directement le sus dit top level comme le suggeste bluestorm.

  10. #10
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    Moi je propose, pour commencer, ça (non essayé).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    let rec int_list_of_input () =
        try
            (read_int ()) :: (int_list_of_input ())
        with
            (* Verifier la syntaxe de Invalid_argument... j'm'en souviens pus ! *)
            | Invalid_argument _ -> []
    Tu entres ceci dans la console...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    > int_list_of_input ()
    3
    666
    7
    Et je pense que tu devrais avoir ceci...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int list - [3; 666; 7]
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    hello

    désolé de répondre si tard mais j'ai eu un week end assez chargé.
    merci pour toute vos reponses.

    Vous suggeger d'utiliser le top level, mais comment faire exactement ?

  12. #12
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    Est-ce que tu as compris les codes que l'on t'a donnés ?

    Si ton programme contient une interface MS DOS, ou autre, mieux vaut demander à ton utilisateur d'entrer les nombres un à un, et non sous forme de liste. En effet, quel intérêt, pour l'utilisateur, de devoir écrire des crochets et des point-virgule quand on peut tout aussi bien les entrer un à un, l'un après l'autre ? De plus, écrire des crochets, des point-virgule, etc... t'oblige à devoir faire un travail de parsing plus délicat.

    Essaye la petite fonction que je t'ai proposée dans le dernier message, puis adapte-la à ton cas. Ca peut être un début. Je ne pense pas qu'il existe de code plus court/simple pour récupérer une liste de nombres (peut-être avec Genlex, mais bon !).
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    je vais tester ton programme

    sauf que dans mon programme , je ne manipule pas une liste d'enteir mais une liste d'un type que j'ai défini

    en tout cas je vais tester ton code, ca m'aidera peut etre

  14. #14
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 681
    Points
    18 681
    Par défaut
    Citation Envoyé par alex_pi Voir le message
    Je pense que le probleme est que tu ne fais pas de distinction entre la sintaxe abstraite et la syntaxe concrete. Je m'explique : Si j'ai bien compris, tu veux definir un mini langage et faire des choses dessus. Ce que tu nous donnes la est la syntaxe abstraite de ton mini-langage, celle qui est ensuite manipulee en interne par ton interpreteur. C'est assez classiquement une structure d'arbre, la dessus, rien a redire.
    En revanche, il semble que tu n'as pas encore defini de syntaxe concrete pour ton langage, c'est a dire une syntaxe utilisable par un utilisateur. Imagine si pour ecrire un programme Caml, tu devais taper
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Def_fun_rec("fact", "n", If_statement( Less(Var "n", Int 1), Int 1, Fun_call(Var "fact" ,sub(Var "n", Int 1))))
    Ca ferait rapidement mal a la tete non? Donc de la meme facon, si tu veux que ton minilangage soit utilisable, il faut que tu lui donnes une syntaxe concrete.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "salut" -> <3 @ [P(hop) & V(paf)] >
    (Je ne connais pas le but de ton langage, donc je ne sais pas si c est une syntaxe appropriee.)
    Et ensuite, il te faudra ecrire un lexeur/parseur (soit a la main, soit avec des outils plus puissant) pour passer de la syntaxe concrete a la syntaxe abstraite. Tu pourras alors manipuler tes programmes a soit.

    Est ce vaguement plus clair ?
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  15. #15
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    Tiens, voici un exemple qui fait déjà ce que tu veux, et qui ne coûte vraiment pas cher en termes de lignes de code !

    Tu peux t'en servir pour compléter ton modèle. Le travail à fournir est très automatique, comme tu peux le voir : il suffit de descendre l'arbre du type des formules et de créer, pour chaque nouveau constructeur/type, la fonction de lecture associée.

    Les fonctions read_integer () et read_string () sont juste là pour envelopper les appels à read_int () et read_line () de la librairie standard : elles sont, bien-sûr, interchangeables.

    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
     
    (* Formules *)
    type formule =
      | Arrobase of int * formule
      | Et of formule * formule 
      | P of string
     
    (* Lit une formule *)
    let rec read_formule () =
      print_endline "Veuillez entrer une formule";
      match read_line () with
        | "Arrobase" -> Arrobase (read_integer (), read_formule ())
        | "Et" -> Et (read_formule (), read_formule ())
        | "P" -> P (read_string ())
        | _ -> failwith "Formule inconnue"
     
    (* Lit un entier ; peut être remplacé par read_int () *)
    and read_integer () =
      print_endline "Veuillez entrer un entier";
      try
        read_int ()
      with
        | Failure "int_of_string" -> failwith "Entier incorrect"
     
    (* Lit une chaîne de caractères ; peut être remplacé par read_line () *)
    and read_string () =
      print_endline "Veuillez entrer une chaîne de caractères";
      read_line ()
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    merci de ta reponse

    j'ai tapé ton code et ca compile bien
    cependant j'ai encore un petit soucis :
    lorsque je demande a l'utilisateur d'entrer une formule, par exemple il tape al formule suivante : Arrobase(N(1),P(p))
    ca me renvoie "Formule inconnue"

  17. #17
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    Tu n'as rien compris au code alors.

    L'utilisateur doit entrer (les "<-" expriment les appuis sur la touche Enter)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Arrobase<-
    N<-
    1<-
    P<-
    p<-
    C'est un tout petit code qui permettra à l'utilisateur d'interagir avec le programme.
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

  18. #18
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    C'est bon,mon probleme a l'air d'etre résolu
    En tout cas ça fait ce que je veux

    Merci beaucoup pour votre aide et vos conseils

    cordialement

    neo666

Discussions similaires

  1. Réponses: 5
    Dernier message: 08/01/2009, 13h37
  2. Réponses: 1
    Dernier message: 13/06/2007, 13h14
  3. transformer une chaine de caracteres en image
    Par jsunnyduckk dans le forum 2D
    Réponses: 7
    Dernier message: 16/02/2007, 14h51
  4. Réponses: 14
    Dernier message: 01/03/2006, 08h32
  5. transformer une chaine de caracteres en du code
    Par giova_fr dans le forum C++
    Réponses: 6
    Dernier message: 15/01/2006, 16h37

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