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 :

[OCaml] décomposer un string


Sujet :

Caml

  1. #1
    Membre expérimenté Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Points : 1 540
    Points
    1 540
    Par défaut [OCaml] décomposer un string
    Bonjour à tous,
    Je débute en caml et je dois dans le cadre de ma formation réaliser un "prouveur de formule"
    cad si je lui envoi : (A => B) <=> (!A v B) il doit me renvoyer "valide"

    Je suis au commencement mais déjà bloqué.
    Je ne sais pas comment décomposer le string en éléments :
    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
    type ensemble = 
         | Variable of string
         | Et of ensemble*ensemble
         | Ou of ensemble*ensemble
         | Non of ensemble
         | Implique of ensemble*ensemble
         | Equivalent of ensemble*ensemble ;;
     
    let rec transformation = function
        a "><" b -> Equivalent  (transformation a)  (transformation b)
      | a "-o" b -> Implique (transformation a)  (transformation b)
      | a "&" b -> Et (transformation a)  (transformation b)
      | a "+" b -> Ou (transformation a)  (transformation b)
      | "!" a -> Non (transformation a)
      | a -> Variable a;;
    Je vois bien que ce n'est pas la bonne méthode (a "><" b -> erreur) mais je ne trouve pas sur internet ( surement mes mots clé qui ne sont pas bon :/)

    Si quelqu'un à un idée , merci beaucoup

    ps : dans le code ci dessus ne prend pas encore en compte les parenhèses

  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
    Le plus simple c'est de ne pas commencer avec des string, mais directement des valeurs plus structurées: pour tester ton code, écrit des valeurs de type "ensemble" directement.

    Passer d'une chaîne non structurée à une valeur de type ensemble est ce qu'on appelle "parser" les formules, et c'est quelque chose de difficile quand on ne l'a jamais fait. Si ta formation n'a pas traité spécifiquement ce point (ce qui n'a pas l'air d'être le cas sinon tu aurais une approche très différente), on ne s'attend pas à ce que tu le fasses toi-même.

  3. #3
    Membre expérimenté Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Points : 1 540
    Points
    1 540
    Par défaut
    Merci pour cette réponse rapide.
    on ne s'attend pas à ce que tu le fasses toi-même.
    Bâ en faite... Si
    c'est quelque chose de difficile quand on ne l'a jamais fait
    Pour les encouragement je repasserais xD
    J'en ai déjà fait un mais pas en caml, je vais aller bouquiner tous ça en ligne.

    Encore merci, je repasserais si j'ai des difficultés.

  4. #4
    Membre éprouvé
    Avatar de Cacophrene
    Homme Profil pro
    Biologiste
    Inscrit en
    Janvier 2009
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Janvier 2009
    Messages : 535
    Points : 1 125
    Points
    1 125
    Par défaut
    Bonsoir,

    Je suis aussi de l'avis de Bluestorm.

    Je pense que tu devrais concentrer tes efforts sur la résolution effective du problème qui t'es posé : le prouveur. Le parsing est une chose ingrate et pénible... tu pourras t'y coller après, quand le reste sera opérationnel.

    Cordialement,
    Cacophrène

  5. #5
    Membre expérimenté Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Points : 1 540
    Points
    1 540
    Par défaut
    @Cacophrene : je suis du même avis que toi, mais (il y a toujours un mais) je ne sais pas part ou commencer pour faire le prouveur
    Donc je préfère avance sur le parser qui est "une chose ingrate et pénible" je confirme

  6. #6
    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
    « Bonjour, j'ai un projet à faire, mais comme je ne sais pas par où commencer j'ai décidé de faire autre chose qui est peut-être utile (... ou pas), mais qui n'a rien à voir et que je ne sais pas faire non plus. Vous pouvez m'aider ? »

    Ce n'est pas en codant un parseur que tu vas magiquement comprendre comment coder le prouveur. Arrête de tourner autour du pot et attaque-toi à ce qu'on te demande vraiment.

    Si tu tiens vraiment à continuer à coder un parseur, tant pis pour toi, voici des liens tirés du livre en ligne Développement d'applications avec Objective Caml :
    - Applications : interprète basic
    - Analyse lexicale et syntaxique

    Le premier lien est sans doute à lire en premier, il utilise des méthodes plus simples mais aussi moins agréables à utiliser. Il vaut mieux le lire, le comprendre, et passer au deuxième pour la mise en pratique.

  7. #7
    Membre expérimenté Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Points : 1 540
    Points
    1 540
    Par défaut
    Ce n'est pas en codant un parseur que tu vas magiquement comprendre comment coder le prouveur
    J'en suis bien conscient ne t'inquiète pas , je sais très bien que se sont 2 fois différentes.

    j'ai décidé de faire autre chose qui est peut-être utile (... ou pas),
    Nous sommes obligé de passer par un parseur.
    1/ Notre prouveur sera testé en appelant un makefile : ./monMakeFile A -> B
    2/ Le prof me la confirmé par mail

    Arrête de tourner autour du pot et attaque-toi à ce qu'on te demande vraiment.
    Pour le moment on nous a juste fournie le sujet du projet sans plus d'explications. Elles arriverons plus tard en TP, TD ou cours.
    Je prend juste de l'avance en attendant le prochain cours pour questionner le prof sur la mise en place du prouveur.

    Merci pour les 2 liens, je vais les feuilleter

    ps : J'ai déjà avancé sur le parseur : Règle en place sur le papier et je pense utiliser camlp4o.cma qui n'a pas l'air trop compliqué après avoir regardé plusieurs exemples sur des calculatrices.

    Edit :
    (*** Les prioritées ***)
    variables ::= ('A'|...|'Z')+
    exprNeg ::= '!' (pthVar|exprNeg)
    pthVar ::= '(' (exprNeg | exprEt) ')' | variables
    exprEt ::= exprOu ('&' exprOu)*
    exprOu ::= exprImpEq ( '+' exprImpEq )*
    exprImpEq ::= pthVar(('><'|'-o')pthVar)*

  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
    Les parseurs Camlp4 sont puissants et agréables à utiliser, mais mal documentés. Si tu as trouvé ce que tu cherches, tant mieux, mais sinon je te conseillerais plutôt la solution lex+yacc, plus standard (et donc en particulier tu pourras réutiliser cette expérience avec un autre langage de programmation). L'outil menhir peut être vu comme une amélioration de ocamlyacc, largement compatible, qui apporte des choses utiles tant pour l'écriture des grammaires que pour leur compréhension et débugage ensuite.

  9. #9
    Membre expérimenté Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Points : 1 540
    Points
    1 540
    Par défaut
    Bonsoir à vous,
    J'ai finalement opté pour lex+yacc.
    J'ai repris les exemples de calculatrices disponibles sur internet et ça c'est très bien fait

    Merci beaucoup pour vos suggestions

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 309
    Points : 933
    Points
    933
    Par défaut
    Citation Envoyé par Ivelios Voir le message
    J'ai finalement opté pour lex+yacc.
    Je confirme ce que dis bluestorm, tu gagnerais à utiliser menhir. C'est un poil plus moderne que yacc quand même !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. OCaml/C Renvoyer un tableau de string ?
    Par Metalman dans le forum Caml
    Réponses: 3
    Dernier message: 12/12/2010, 17h14
  2. Réponses: 2
    Dernier message: 22/02/2008, 23h02
  3. Décomposer un String
    Par npirard dans le forum Langage
    Réponses: 4
    Dernier message: 10/10/2007, 15h47
  4. Décomposer une String en array<String^>
    Par ben_ghost dans le forum C++/CLI
    Réponses: 4
    Dernier message: 09/08/2006, 15h26
  5. Décomposer une string
    Par The Lord of Nesquik dans le forum C++
    Réponses: 20
    Dernier message: 30/06/2006, 10h02

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