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 :

Transformation d'une string en syntaxe abstraite


Sujet :

Caml

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 67
    Points : 36
    Points
    36
    Par défaut Transformation d'une string en syntaxe abstraite
    Salut

    A partir d'une expression algébrique contenue dans une string, je voudrais construire la syntaxe abstraite (AST).

    Prenons un exemple
    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
     
    let expr_s = "2 * var^2 + var - 1";;
     
    (* Element de la syntaxe abstraite *)
    type expr = 
      | Const of int
      | Var of string
      | Add of expr * expr
      | Mul of expr * expr
      | Exp of expr * int;;
     
    (* La fameuse fonction qui prend en entrée une string est retourne l'AST *)
    let String_to_Expr = ????
     
    (* L'AST attendue est :   
    Add( Add( Mul( Const 2, Exp( Var "var", 2)), Var "var"), Const -1)  
    *)

    Je debute en ocaml, y a quelques mois j'avais commencé a coder un programme qui donne la derivée d'une expression en m'inspirant de l'exemple du livre SICP. Et puis par manque de temps, j'ai laissé de coté ce projet. Je le reprend aujourd'hui et j'ai l'impression de repartir de zero par manque de pratique.

    Avez vous une solution facile pour ce probleme?

    Merci d'avance.

    ps: je suis content de voir que les choses ont evolué sur le forum et que maintenant ocaml a le droit a sa propre section.

  2. #2
    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 679
    Points
    18 679
    Par défaut
    perso, j'utiliserais ocamllex/ocamlyacc pour générer mon ast
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  3. #3
    Membre averti
    Avatar de Strab
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 338
    Points : 330
    Points
    330
    Par défaut
    Voici un lien vers l'énoncé et le corrigé d'un TP que j'avais fait en prépa sur l'évaluation de formules simples, ça t'aidera peut-être : http://pauillac.inria.fr/~quercia/cd...s/formules.tgz

    On avait aussi fait un évaluateur d'un mini-caml, mais je ne le retrouve pas et c'était semblable au lien précédent.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 67
    Points : 36
    Points
    36
    Par défaut
    En attendant vos reponse j'ai trouvé ca
    C'est un exemple tres detaillé pour l'evaluation d'un programme en BASIC.

    Pour ce qui est de ocamllex et ocamlyacc, c'est pas trop l'usine a gaz pour parser une string comme j'ai? Et puis mon but, c'est aussi d'apprendre le language et donc se casser un peu la tete sans utiliser des solutions toutes faites... Qu'en pensez vous?

    Sinon je pense que le corrigé du TP parait pas mal pour commencer. Pour faire des trucs plus evolués je jeterais un coup d'oeil sur le lien precedemment cité.

  5. #5
    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
    Que dalle ! Vous vous plantez-là !

    Il faut utiliser le module Genlex de la librairie standard. La doc se trouve ici :

    http://caml.inria.fr/pub/docs/manual...ef/Genlex.html

    ocamllex/ocamlyacc c'est bien, mais pour ce genre de trucs, utiliser ce petit module est bien plus simple.

    Si tu veux réellement utiliser les arbres de syntaxe internes, il faut voir Camlp4, mais ça ne t'aidera pas beaucoup, je pense.
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

  6. #6
    Membre expérimenté
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Points : 1 640
    Points
    1 640
    Par défaut
    Il faut utiliser le module Genlex de la librairie standard
    Absolument d'accord.
    En premier lieu, utilisez un moteur de recherche.
    En second lieu, postez sur le forum adéquat !

  7. #7
    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 679
    Points
    18 679
    Par défaut
    Citation Envoyé par InOCamlWeTrust
    ocamllex/ocamlyacc c'est bien, mais pour ce genre de trucs, utiliser ce petit module est bien plus simple.

    j'aurais du proposé menhir...
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  8. #8
    Membre actif Avatar de Steki-kun
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 222
    Points : 281
    Points
    281
    Par défaut
    Citation Envoyé par Patriarch24
    Absolument d'accord.
    +1 !

    Cela dit c'est bien de savoir utiliser ocamlyacc et lex (non c est pas une usine a gaz d'abord ) mais Genlex permet de faire deja pas mal de trucs, c simple, c dans ton fichier .ml, etc. J'ai déjà refait caml light presqu'en entier rien qu'avec genlex
    I'm the kind of guy that until it happens, I won't worry about it. - R.H. RoY05, MVP06

  9. #9
    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
    Genre tu as refait Caml Light ! Et pour l'analyse syntaxique, tu as fait comment ?
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 67
    Points : 36
    Points
    36
    Par défaut
    Cool genlex

    Par contre, par curiosité j'ai voulu voir comment c'etait implementé... et j'ai rien compris.
    J'ai du mal avec toutes ces fonctions imbriquées les une dans les autres avec 'in' 'and' etc... a voir les sous blocs... Quand on voit ca, je trouve pas que ocaml soit particulierement lisible. J'imagine que c'est de l'entrainement...

    Genlex repose sur les streams a premiere vue, et je n'ai pas encore abordé ce point. Mais je vais essayer de comprendre comment fonctionne ce module.

    [EDIT] Je ne comprends pas l'utilisation du constructeur Some (que je ne connaissais pas avant ce soir).

    Pourquoi ne pas faire tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      match Stream.peek strm__ with
           ' ' | '\010' | '\013' | '\009' | '\026' | '\012' ->
            Stream.junk strm__; next_token strm__
        | 'A'..'Z' | 'a'..'z' | '_' | '\192'..'\255' as c ->
            Stream.junk strm__;
            let s = strm__ in reset_buffer (); store c; ident s
    Au lieu de,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    match Stream.peek strm__ with
          Some (' ' | '\010' | '\013' | '\009' | '\026' | '\012') ->
            Stream.junk strm__; next_token strm__
        | Some ('A'..'Z' | 'a'..'z' | '_' | '\192'..'\255' as c) ->
            Stream.junk strm__;
            let s = strm__ in reset_buffer (); store c; ident s
    Il me semble que c'est possible?

  11. #11
    Membre expérimenté
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Points : 1 640
    Points
    1 640
    Par défaut
    En général, on utilise un type inductif pour unifier des données, en particulier pour les types de retour des fonctions.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    type result = Some of int | None;;
    Cela est particulièrement utile pour éviter les fonctions partielles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    let fact n = 
       let rec aux var (Some acc) = 
           if(var = 0) 
             then (Some acc)
           else aux (var-1) (Some (acc*var))
       in
          if (n<0)
            then None
          else aux n (Some 1);;
     
    fact : int->result
    qui calcule la factorielle quel que soit le nombre en entrée (pas d'exceptions). Je suppose que l'utilisation de Some ici est due à la définition du type associé.
    En premier lieu, utilisez un moteur de recherche.
    En second lieu, postez sur le forum adéquat !

  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
    Plus généralement, on se sert du type 'a option pour marquer le fait qu'une valeur peut être présente ou non dans un type.

    En ce moment, je m'en sers beaucoup dans des arbres de syntaxe, ou certaines parties de syntaxe peuvent être absentes, comme par exemple des constructions optionnelles ou des mots-clef optionnels (ou autres...).

    Pour ce qui est de la fonction plus haut.

    Autre chose : les constructeurs Some et None font partie du module Pervasives, celle qui est ouverte par défaut, et ils sont regroupés sous le nom de type 'a option... donc pas la peine de les redéfinir.
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

  13. #13
    Membre expérimenté
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Points : 1 640
    Points
    1 640
    Par défaut
    Autre chose : les constructeurs Some et None font partie du module Pervasives, celle qui est ouverte par défaut, et ils sont regroupés sous le nom de type 'a option... donc pas la peine de les redéfinir.
    effectivement, j'aurais dû le préciser. D'ailleurs, je me demande pourquoi j'ai nommé mon type result... (à vouloir répondre trop vite...)
    En premier lieu, utilisez un moteur de recherche.
    En second lieu, postez sur le forum adéquat !

  14. #14
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 139
    Points : 68
    Points
    68
    Par défaut
    où peut-on télécharger Menhir pour windows?

  15. #15
    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 679
    Points
    18 679
    Par défaut
    Citation Envoyé par zekabyle
    où peut-on télécharger Menhir pour windows?


    déjà que menhir pour linux via godi plante à la compil...
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  16. #16
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    967
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 967
    Points : 1 410
    Points
    1 410
    Par défaut
    Je l'avais installé sous Linux, via Godi, et ça marche parfaitement.

    où peut-on télécharger Menhir pour windows?
    Je ne sais pas. A priori, il n'y a que les sources de disponibles... tu peux t'amuser à les compiler.
    http://cristal.inria.fr/~fpottier/menhir/

  17. #17
    Membre actif Avatar de Steki-kun
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 222
    Points : 281
    Points
    281
    Par défaut
    Citation Envoyé par LLB
    Je l'avais installé sous Linux, via Godi, et ça marche parfaitement.


    Je ne sais pas. A priori, il n'y a que les sources de disponibles... tu peux t'amuser à les compiler.
    http://cristal.inria.fr/~fpottier/menhir/
    Je confirme je l'ai compilé y'a pas si longtemps que ça il marche très bien. A noter que tu as besoin d'ocaml > 3.9.
    I'm the kind of guy that until it happens, I won't worry about it. - R.H. RoY05, MVP06

  18. #18
    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 679
    Points
    18 679
    Par défaut
    Citation Envoyé par LLB
    Je l'avais installé sous Linux, via Godi, et ça marche parfaitement.

    ben chez moi ça a merdé... il y a moins d'un mois

    gros problème de makefile
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  19. #19
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 139
    Points : 68
    Points
    68
    Par défaut
    où dois-je mettre ces sources?
    j'ai ocaml 3.09 et je ne sais pas où mettre les sources de menhir, (je suis sous windows)

Discussions similaires

  1. Transformer un Tableau de String en seul une string
    Par jojob dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 31/05/2011, 13h44
  2. Transformer une String en Unicode
    Par annemarie dans le forum Delphi
    Réponses: 3
    Dernier message: 28/02/2007, 17h43
  3. Transformer une string en un dictionnaire
    Par nabix dans le forum Général Python
    Réponses: 5
    Dernier message: 24/11/2005, 17h34
  4. [C#] transformer un XmlDocument en une string
    Par kaboume dans le forum ASP.NET
    Réponses: 2
    Dernier message: 22/06/2005, 11h49
  5. [Syntaxe] mettre des ' dans une string ?
    Par souch dans le forum Débuter
    Réponses: 4
    Dernier message: 14/08/2003, 16h26

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